从taskqueue按名称获取任务

时间:2014-03-24 22:49:28

标签: python google-app-engine task-queue

如何按名称获取任务?

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

应该可以使用REST API(https://developers.google.com/appengine/docs/python/taskqueue/rest/tasks/get)。但我更喜欢像task_queue.get_task_by_name('foobar')这样的东西。有任何想法吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:5)

无法保证具有此名称的任务存在 - 它可能已经执行过。即使您设法get任务,也可以在尝试使用它时执行。所以当你试图把它放回去时,你不知道你是第一次还是第二次添加它。

由于这种不确定性,我无法看到任何使用名称获取任务的用例。

编辑:

您可以为任务命名,以确保特定任务仅执行一次。将具有名称的任务添加到队列时,App Engine将检查具有此名称的任务是否已存在。如果是,则后续尝试将失败。

例如,您可以运行许多实例,并且每个实例可能需要在数据存储区中插入实体。您的第一个选择是检查数据存储中是否已存在实体。这是一个相对较慢的操作,当您收到响应(实体不存在)并决定插入它时,另一个实例可能已经插入它。所以你最终得到两个实体而不是一个。

您的第二个选择是使用任务。实例不是直接将新实体插入数据存储区,而是创建一个插入它的任务,并为该任务命名。如果另一个实例尝试添加具有相同名称的任务,则它将简单地覆盖现有任务。因此,您可以保证只插入一次实体。