Mon application Gae récupère des données JSON à partir d'un site tiers; Étant donné un ID représentant l'élément à télécharger, les données de l'élément sur ce site sont organisées en plusieurs pages, mon code doit donc télécharger des blocs de données, page après page, jusqu'à ce que les données de la dernière page disponible soient récupérées.
Mon code simplifié ressemble à ceci:Google App Engine: comment paralléliser les téléchargements en utilisant TaskQueue ou Async Urlfetch?
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})
Les résultats data_list
est une liste ordonnée où le premier élément a données du numéro de page 1 et le dernier élément a données de la dernière pages; ce data_list
, une fois récupéré, est rendu dans une vue.
Cette approche fonctionne 99% des cas, mais parfois, en raison de la 30 secondes limite imposée par Google App Engine, sur des articles de plusieurs pages que je reçois la DeadlineExceededError
redoutée. Je voudrais savoir si vous utilisez TaskQueue | Deferred | AsyncUrlfetch Je pourrais améliorer cet algorithme parallélisant en quelque sorte les N appels urlfetch.
Laissez-moi savoir si la solution fonctionne ci-dessous pour vous –
avez vous avez eu de la chance? –