我的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 | Deferred | 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()

关于python - Google App Engine:如何使用TaskQueue或Async Urlfetch并行下载?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3539240/

10-12 22:23