2009-07-18 5 views
0

Angenommen, ich hatte über 10.000 Feeds, die ich regelmäßig abrufen/analysieren wollte. Wenn der Zeitraum 1h wäre, würde 24x10000 = 240.000 abgerufen werden.Verwenden von Aufgabenwarteschlangen, um das Abrufen/Parsen einer Reihe von Feeds in appengine python zu planen

Die aktuelle Grenze von 10k des Labs taskqueue api würde eine von ausschließen, die eine Task pro Abruf aufruft. Wie würde man das dann machen?

Update: Re: Holen nurls pro Aufgabe: angesichts der 30 Sekunden Timeout pro Anfrage irgendwann würde dies eine Grenze treffen. Ist dort paralellize es so jeden tasqueue initiiert eine Reihe von async paralell Fetches von denen jeder würde weniger als 30 Sekunden zu beenden, aber die Menge togetherhere kann mehr als das nehmen

Antwort

2

2 holt pro Aufgabe? 3?

0

Gruppieren Sie die Abrufe, also anstatt Schlange zu stehen, rufen Sie an, sagen wir, eine Arbeitseinheit, die 10 Abrufe ausführt.

+0

Bitte beachten Sie das Update auf die Frage. – molicule

3

Hier ist die asynchrone urlfetch API:

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

Set eines Bündels von Anforderungen mit einer angemessenen Frist (geben Sie sich etwas Spielraum unter dem Timeout, so dass, wenn eine Anfrage mal haben Sie immer noch, um Zeit verarbeite die anderen). Warten Sie dann nacheinander und verarbeiten Sie sie, sobald sie abgeschlossen sind.

Ich habe diese Technik nicht selbst in GAE verwendet, Sie sind also auf der Suche nach nicht offensichtlichen Fallstricken. Leider scheint es in der API keinen select() Aufruf zu geben, um auf die erste von mehreren Anforderungen zu warten.

+0

Also, wenn ich die Async-Dokumente richtig lese, nachdem eine Reihe von RPCs initiiert und mit for rpc in rpcs: rpc.wait() geschlossen wurden, kehrt die ursprüngliche Task-Warteschlange zurück (die 30s-Zeitüberschreitung für HTTP-Aufrufe erfüllend). Die asynchronen Urlabels arbeiten jedoch fort (kopflos) und werden von dem zugeordneten Rückruf verarbeitet. Ist das richtig?? – molicule

+0

Nein, wait() ruft den Callback auf, bevor er zurückkehrt. –

Verwandte Themen