Получение задания по имени из taskqueue
Как я могу получить задание по имени?
from google.appengine.api import taskqueue
taskqueue.add(name='foobar', url='/some-handler', params={'foo': 'bar'}
task_queue = taskqueue.Queue('default')
task_queue.delete_tasks_by_name('foobar') # would work
# looking for a method like this:
foobar_task = task_queue.get_task_by_name('foobar')
Это должно быть возможно с помощью API REST ( https://developers.google.com/appengine/docs/python/taskqueue/rest/tasks/get). Но я бы предпочел что-то вроде task_queue.get_task_by_name('foobar')
, Есть идеи? Я что-то пропустил?
1 ответ
Нет гарантии, что задача с таким именем существует - возможно, она уже выполнена. И даже если вам удастся get
задача может быть выполнена, пока вы пытаетесь что-то с ней сделать. Поэтому, когда вы пытаетесь вернуть его обратно, вы не представляете, добавляете ли вы его в первый раз или во второй раз.
Из-за этой неопределенности я не вижу ни одного варианта использования, когда получение задачи по имени может быть полезным.
РЕДАКТИРОВАТЬ:
Вы можете дать имя своей задаче, чтобы конкретная задача выполнялась только один раз. Когда вы добавляете задачу с именем в очередь, App Engine проверит, существует ли задача с таким именем. Если это произойдет, следующая попытка не удастся.
Например, у вас может быть много запущенных экземпляров, и каждому экземпляру может потребоваться вставить объект в хранилище данных. Первый вариант - проверить, существует ли сущность в хранилище данных. Это относительно медленная операция, и к тому времени, когда вы получили свой ответ (сущность не существует) и решили вставить его, другой экземпляр мог уже вставить его. Таким образом, вы получите две сущности вместо одной.
Ваш второй вариант - использовать задачи. Вместо вставки новой сущности непосредственно в хранилище данных, экземпляр создает задачу для ее вставки и дает этой задаче имя. Если другой экземпляр попытается добавить задачу с тем же именем, он просто переопределит существующую задачу. В результате вам гарантируется, что объект будет вставлен только один раз.