2014-03-24 83 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