<p>如果您想缩短实例时间,可以将单个同步查询分解为多个异步查询,这样可以在执行其他工作时预取结果。而不是使用文档.all().fetch(),使用文档.all()。运行()。您可能必须阻止您迭代的第一个查询,但当它完成时,所有其他查询都将完成加载结果。如果你想得到200个实体,试着一次使用5个查询。在</p>
<pre><code>q1 = Document.all().run(prefetch_size=20, batch_size=20, limit=20, offset=0)
q2 = Document.all().run(prefetch_size=45, batch_size=45, limit=45, offset=20)
q3 = Document.all().run(prefetch_size=45, batch_size=45, limit=45, offset=65)
q4 = Document.all().run(prefetch_size=45, batch_size=45, limit=45, offset=110)
q5 = Document.all().run(prefetch_size=45, batch_size=45, limit=45, offset=155)
for i,d in enumerate(q1):
out += '<tr><td>%s</td><td>%s</td></tr>' % (d.title, d.lastEditedBy.name)
for i,d in enumerate(q2):
out += '<tr><td>%s</td><td>%s</td></tr>' % (d.title, d.lastEditedBy.name)
for i,d in enumerate(q3):
out += '<tr><td>%s</td><td>%s</td></tr>' % (d.title, d.lastEditedBy.name)
for i,d in enumerate(q4):
out += '<tr><td>%s</td><td>%s</td></tr>' % (d.title, d.lastEditedBy.name)
for i,d in enumerate(q5):
out += '<tr><td>%s</td><td>%s</td></tr>' % (d.title, d.lastEditedBy.name)
</code></pre>
<p>我为我的蹩脚Python道歉,但想法很简单。设置预取_size=batch_size=limit,一次启动所有查询。q1的尺寸比较小,因为我们会先阻塞它,而阻塞是浪费时间的。到q1完成时,q2将完成或接近完成,q3-5您将支付零延迟。在</p>
<p>有关详细信息,请参见<a href="https://developers.google.com/appengine/docs/python/datastore/async#Async_Queries" rel="nofollow">https://developers.google.com/appengine/docs/python/datastore/async#Async_Queries</a>。在</p>