Одним из решений закрытия решения вашей проблемы является добавление одной транзакционной задачи , которая разветвляет оставшиеся задачи.Просто добавьте одну задачу разветвления в существующую транзакцию.
Если для этого нет причин для бизнес-логики, не запускайте задачу, которая уже запущена.Предотвращение повторной вставки (т.е. дублирования) задач является простым и экономит ресурсы.Ваша задача разветвления в основном будет выглядеть следующим образом:
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
Добавление задачи разветвления транзакционно гарантирует ее постановку в очередь.Ошибки, возникающие в результате выполнения уже запущенной задачи, перехватываются и игнорируются, другие ошибки приводят к повторному запуску задачи разветвления.С помощью этого шаблона вы можете легко вставить много подзадач.