我想搬到ndb
,并且一直想知道是否使用异步urlfetch
任务。我不确定我是否完全理解它是如何工作的,因为文档有点差,但对于这个特定的用例来说似乎很有希望。
目前我像这样使用异步urlfetch
。它与实际的线程或并行代码相去甚远,但与仅顺序请求相比,它仍然显着提高了性能。
def http_get(url):
rpc = urlfetch.create_rpc(deadline=3)
urlfetch.make_fetch_call(rpc,url)
return rpc
rpcs = []
urls = [...] # hundreds of urls
while rpcs < 10:
rpcs.append(http_get(urls.pop()))
while rpcs:
rpc = rpcs.pop(0)
result = rpc.get_result()
if result.status_code == 200:
# append another item to rpcs
# process result
else:
# re-append same item to rpcs
请注意,此代码已简化。实际的代码会捕获异常,进行一些额外的检查,并且只会尝试重新附加相同的项目几次。在这种情况下没有区别。
我应该补充一点,处理结果不涉及任何db
操作。