Разветвление задач - как массово добавлять задачи в очередь - более 5 - PullRequest
4 голосов
/ 30 сентября 2010

Я использую задачу (queuing-task), чтобы поставить в очередь несколько других задач - разветвление. Когда я пытаюсь использовать Queue.add с аргументом задачи, являющимся списком экземпляров Task , содержащих более 5 элементов и находящихся в транзакции ... я получаю эту ошибку.

JointException: taskqueue.DatastoreError caused by: 
    <class 'google.appengine.api.datastore_errors.BadRequestError'> 
    Too many messages, maximum allowed 5

Есть ли другой способ поставить в очередь более 5 задач в транзакции?

Или ...

Может быть, мне не нужна транзакция, причина:

  1. Мне все равно, если какое-либо из этих заданий все равно попадет в очередь дважды, и
  2. если очередь не удастся ни для одного из них, тогда вся задача очереди будет запущена заново.

Итак, скажите мне, как поставить в очередь более 5 задач в транзакции, или скажите, чтобы я не использовал транзакцию, потому что она мне действительно не нужна.

1 Ответ

2 голосов
/ 30 сентября 2010

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

Если для этого нет причин для бизнес-логики, не запускайте задачу, которая уже запущена.Предотвращение повторной вставки (т.е. дублирования) задач является простым и экономит ресурсы.Ваша задача разветвления в основном будет выглядеть следующим образом:

class FanOutTask(webapp.RequestHandler):
  def get(self):
    name = self.request.get('name')
    params = deserialize(self.request.get('params'))

    try:
      task_params = params.get('stuff')
      taskqueue.add(url='/worker/1', name=name + '-1', params=task_params)
    except TaskAlreadyExistsError:
      pass

    try:
      task_params = params.get('more')
      taskqueue.add(url='/worker/2', name=name + '-2', params=task_params)
    except TaskAlreadyExistsError:
      pass

Добавление задачи разветвления транзакционно гарантирует ее постановку в очередь.Ошибки, возникающие в результате выполнения уже запущенной задачи, перехватываются и игнорируются, другие ошибки приводят к повторному запуску задачи разветвления.С помощью этого шаблона вы можете легко вставить много подзадач.

...