2010-11-19 9 views
5

ich ein Skript leite die mehrere Aufgaben initiiert:ein Skript aufrufen, nachdem Aufgaben Warteschlange leer ist

for i in range (0,5): 
    taskqueue.add(url='/example', 
          params={'num': i}) 

Soweit ich verstehe, sind die Aufgaben parallel ausgeführt werden. Kann ich AppEngine mitteilen, eine bestimmte Task/Python-Datei auszuführen, sobald alle Aufgaben, die ich gerade in die Warteschlange eingefügt habe, ALLE beendet haben? Ich dachte über das Senden einer Flagge an die Aufgabe, die in der letzten Schleife Iteration aufgerufen wurde, aber wenn Aufgaben parallel ausgeführt werden, ist es nicht garantiert, dass, sobald es abgeschlossen ist, auch die anderen beendet wurden.

Danke,

Joel

Antwort

4

Wenn Sie die Aufgaben initiieren, wissen Sie, wie viele es sein werden. Fügen Sie eine Entität mit der erwarteten Anzahl oder Aufgabenliste in den Datenspeicher ein. Verwenden Sie dann entweder Zähler oder Markierungen, um anzugeben, wann eine Aufgabe ausgeführt wurde. Grob gesagt, könnte der Prozess etwas wie folgt aussehen:

Die neuen Arten:

class TaskBatch(db.Model): 
    expected_count = db.IntegerProperty() 

class TaskMarker(db.Model): 
    pass 

Dann stellen Sie Ihren Aufruf Routine etwas wie zu tun:

count = 5 
taskbatch = TaskBatch(expected_count=count).put() 
for i in range(5): 
    taskqueue.add(url='/example', 
        params={'num': i, 'batch': str(taskbatch)}) 

Und am Ende Ihrer Aufgaben :

def post(self): 
    num = self.request.get('num') 
    # do your stuff.... 

    batch = self.request.get('batch') 
    TaskMarker(key_name=num, parent=db.Key(batch)) 
    taskqueue.add(url='/example/isdone', 
        params={'num': i, 'batch': str(taskbatch)}) 

Und die isdone Aufgabe etwas aussehen könnte:

Der genaue Prozess variiert je nach den Besonderheiten Ihres Anwendungsfalls, z. B. wie viele Aufgaben Sie einfügen.

Verwandte Themen