Вызов скрипта после того, как очередь задач пуста - PullRequest
5 голосов
/ 19 ноября 2010

Я запускаю скрипт, который запускает несколько задач:

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

Насколько я понимаю, задачи выполняются параллельно.Могу ли я сказать AppEngine, чтобы я запускал определенную задачу / файл python, когда все задачи, которые я только что вставил в очередь, ВСЕ завершены?Я думал об отправке флага задаче, которая была вызвана в последней итерации цикла, но если задачи выполняются параллельно, не гарантируется, что после ее завершения другие тоже будут завершены.

Спасибо,

Джоэл

1 Ответ

4 голосов
/ 19 ноября 2010

Когда вы начинаете задание, вы знаете, сколько их будет.Вставьте объект в хранилище данных с «ожидаемым» количеством или списком задач.Затем используйте счетчики или маркеры, чтобы указать, когда задача была запущена.Грубо говоря, процесс может выглядеть примерно так:

Новые виды:

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

class TaskMarker(db.Model):
    pass

Затем настройте подпрограмму вызова таким образом:

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

Ив конце ваших задач:

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

И задача isdone может выглядеть примерно так:

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.

Точный процесс будет немного отличаться в зависимости от особенностей вашего сценария использования,например, сколько задач вы вставляете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...