2014-03-24 81 views
6

如何通过名称获取任务?从任务队列中按名称获取任务

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')。有任何想法吗?我错过了什么?

回答

5

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

由于这种不确定性,我看不到任何通过名称获取任务可能有用的用例。

编辑:

可以为了确保特定的任务只执行一次给一个名称,你的任务。当您将具有名称的任务添加到队列时,App Engine将检查具有该名称的任务是否已存在。如果是这样,随后的尝试将失败。

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

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

+0

好点。怎么样一个简单的''task_queue.task_exists('foobar')''? – mattes

+0

同样的故事。当你有“它确实存在”的时候,它可能不再存在了。就像薛丁格的猫。 –

+0

嗯。我不明白在询问任务时是否存在什么问题? – mattes