Frage

Mein Gae Anwendung ruft JSON-Daten von einem Dritten Ort; eine ID, die den Artikel zum Download gegeben, auf dieser Seite der Daten des Elements wird in mehreren Seiten organisiert, so mein Code Download Datenblocks hat, Seite für Seite, bis die Daten der letzten verfügbaren Seite abgerufen wird.
Mein vereinfachten Code sieht wie folgt aus:

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} )

Die data_list Ergebnisse ist eine geordnete Liste, wo die erste Positionsdaten Seitennummer 1 hat und die letzten Positionsdaten der letzten Seite hat; diese data_list, einmal abgerufen, in einer Ansicht gerendert.

Dieser Ansatz funktioniert 99% der Zeit, aber manchmal wegen der 30 Sekunden Grenze auferlegt wird von Google App Engine, auf Elemente mit vielen Seiten ich den gefürchteten DeadlineExceededError bekommen. Ich möchte, wenn wissen, mit Taskqueue | Latente | AsyncUrlfetch ich diesen Algorithmus Parallelisierung in irgendeiner Weise Anrufe die N urlfetch verbessern könnte.

War es hilfreich?

Lösung

Mit dieser: http://code.google.com/ appengine / docs / python / urlfetch / asynchronousrequests.html

, die einfach ist wie folgt:

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()

Andere Tipps

Ich habe mit diesem aufgelöst:

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]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top