2010-11-19 8 views
5

estoy corriendo un script que inicia varias tareas:Llamar a un guión después de las tareas de cola está vacía

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

Por lo que yo entiendo, las tareas se ejecutan en paralelo. ¿Hay alguna forma en que pueda decirle a AppEngine que ejecute un archivo de tarea/pitón específico una vez que todas las tareas que acabo de insertar en la cola estén TODAS terminadas? Pensé en enviar una bandera a la tarea que se llamó en la última iteración de bucle, pero si las tareas se ejecutan en paralelo, no está garantizado que una vez que haya finalizado, las otras también hayan terminado.

Gracias,

Joel

Respuesta

4

Al iniciar las tareas, usted sabe cuántas habrá. Inserte una entidad en el almacén de datos con el conteo 'esperado' o la lista de tareas. Luego use contadores o marcadores para indicar cuándo se ha ejecutado una tarea. Más o menos, que el proceso podría ser algo como:

Los nuevos tipos:

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

class TaskMarker(db.Model): 
    pass 

A continuación, ajuste su rutina de llamada a hacer algo como:

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

Y, al final de sus tareas :

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

Y la tarea isdone podría ser algo como:

def post(self): 
    num = self.request.get('num') 
    batch_key = db.Key(self.request.get('batch')) 
    batch = TaskBatch.get(batch_key) 
    marker_keys = [db.Key.from_path('TaskMarker', i, parent=batch) 
        for i in range(batch.expected_count)] 
    markers = db.get(marker_keys) 
    if all(markers): 
     # do your done action. 

El proceso exacto puede variar ligeramente en función de las características específicas de su caja de uso, como por ejemplo, cuántas tareas realiza su inserción.

Cuestiones relacionadas