[英]Google App Engine: how to parallelize downloads using TaskQueue or Async Urlfetch?
我的Gae应用程序从第三方站点检索JSON数据; 给定一个代表要下载项目的ID,此站点上项目的数据将组织成多页,因此我的代码必须一页一页地下载数据块,直到检索到最后一个可用页面的数据为止。
我的简化代码如下所示:
class FetchData(webapp.RequestHandler):
def get(self):
...
data_list = []
page = 1
while True:
fetched_data= urlfetch.fetch('http://www.foo.com/getdata?id=xxx&result=JSON&page=%s' % page)
data_chunk = fetched_data["data"]
data_list = data_list + data_chunk
if len(data_list) == int(fetched_data["total_pages"]):
break
else:
page = page +1
...
doRender('dataview.htm',{'data_list':data_list} )
data_list
结果是一个有序列表,其中第一项具有页面编号1的数据,最后一项具有最新页面的数据; 一旦检索到此data_list
,就会在视图中呈现它。
这种方法可以工作99%的时间,但有时由于Google App Engine施加的30秒限制,在具有很多页面的项目上我会收到可怕的DeadlineExceededError
。 我想知道是否使用TaskQueue | 递延 | AsyncUrlfetch我可以通过N urlfetch调用以某种方式改进该算法的并行化。
使用此: http : //code.google.com/appengine/docs/python/urlfetch/asynchronousrequests.html
像这样简单:
def handle_result(rpc):
result = rpc.get_result()
# ... Do something with result...
# Use a helper function to define the scope of the callback.
def create_callback(rpc):
return lambda: handle_result(rpc)
rpcs = []
for url in urls:
rpc = urlfetch.create_rpc()
rpc.callback = create_callback(rpc)
urlfetch.make_fetch_call(rpc, url)
rpcs.append(rpc)
# ...
# Finish all RPCs, and let callbacks process the results.
for rpc in rpcs:
rpc.wait()
我已经解决了:
chunks_dict = {}
def handle_result(rpc, page):
result = rpc.get_result()
chunks_dict[page] = result["data"]
def create_callback(rpc, page):
return lambda: handle_result(rpc, page)
rpcs = []
while True:
rpc = urlfetch.create_rpc(deadline = 10)
rpc.callback = create_callback(rpc, page)
urlfetch.make_fetch_call(rpc, 'http://www.foo.com/getdata?id=xxx&result=JSON&page=%s' % page)
rpcs.append(rpc)
if page > total_pages:
break
else:
page = page +1
for rpc in rpcs:
rpc.wait()
page_keys = chunks_dict.keys()
page_keys.sort()
for key in page_keys:
data_list= data_list + chunks_dict[key]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.