异步GAE数据存储查询未正确触发

2024-09-27 21:27:49 发布

您现在位置:Python中文网/ 问答频道 /正文

执行异步GAE NDB数据存储查询时遇到问题。出于测试目的,假设我执行

l = []
for i in range (0,50):
    qry = NDBNetLoc.query(NDBNetLoc.netloc == 'imdb.com').get()
    l.append(qry)

其中netloc是我的模型的索引属性(没有其他属性;我在这里修复字符串,但通常查询的字符串是唯一的)。这当然会在请求中形成一个“瀑布”:

http://imgur.com/a/uckrh#FAON8pZ

这是典型的请求类型,应该是异步的(根据Google)。因此,我执行

futs = []
for i in range (0,50):
    qry = NDBNetLoc.query(NDBNetLoc.netloc == 'imdb.com').get_async()
    futs.append(qry)

for fut in futs:
    l.append(fut.get_result())

但我看不出有什么进步。当每个请求一个接一个地触发时,每个调用都需要更长的时间(持续时间随着i的增加而减少)

http://imgur.com/a/uckrh#eUVfLrG

此外,似乎直到第二个for循环才触发请求。如果我在这个循环前面添加一个time.sleep(2),我会得到如下结果

http://imgur.com/a/uckrh#SztJnkn

这对我来说非常混乱,因为我认为一旦创建了未来的对象,请求就会触发。因此,我的两个问题是1)为什么在每个未来对象实例化的那一刻请求没有启动,2)为什么每个请求现在需要更长的时间(到了异步或同步完成这一点相当于完成时间的程度)?你知道吗

编辑: 我应该补充一点,我之所以没有对唯一的netloc列表执行一个简单的IN查询,是因为我最终运行了更复杂的查询(即,对于许多NDBNetLoc和许多foo,获取所有具有propertyA=foo的Model2和从第一个查询返回的特定NDBNetLoc的祖先)。你知道吗


Tags: incomhttpforget时间rangequery
1条回答
网友
1楼 · 发布于 2024-09-27 21:27:49

我找到了这个问题的摘要,所以。。。我不太熟悉全局解释器锁以及它在这里的应用,但是我想解码我的RPC的代码是CPython字节码,解释器不是线程安全的,所以每次调用都会锁定它。我想我会转到Java。。。。。你知道吗

AppEngine Query.fetch_async not very asynchronous?

相关问题 更多 >

    热门问题