2011-08-26 55 views
2

我使用deferred將任務置於AppEngine應用的默認隊列中,類似於this approachAppEngine任務隊列API調用在TaskAlreadyExistsError上增加

我使用每5秒更改一次的時間戳命名任務。在那段時間內,很多電話都是以相同的名字進入隊列,導致TaskAlreadyExistsError沒有問題。問題是,當我檢查配額時,「任務隊列API調用」對於每次調用都在增加,而不僅僅是那些實際被放入隊列中的調用。

如果你看看配額我的意思是:Task Queue API Calls: 34,017 of 100,000,並比較實際的隊列中的呼叫:/_ah/queue/deferred - 2.49K

這裏是處理隊列中的代碼:

try: 
    deferred.defer(function_call, params, _name=task_name, _countdown=int(interval/2)) 
except (taskqueue.TaskAlreadyExistsError, taskqueue.TombstonedTaskError): 
    pass 

我想這是它的方式作品。有配額解決問題的好方法嗎?我可以使用memcache來存儲task_name,並檢查除上述try/catch之外是否添加了任務嗎?或者有沒有辦法檢查任務是否已經存在,而不使用任務隊列API調用?

回答

2

感謝您指出這是事實,因爲我沒有意識到,但同樣的問題一定會影響到我。

據我所知,將任何東西放入由任務名組成的memcache中應該可以正常工作,然後如果你想在memcache上減少這些命中,你也可以在本地存儲標誌。

+0

嗯,有趣的事例。我可能會嘗試,但我可能會選擇memcache解決方案。不管怎麼說,還是要謝謝你! – Ragnar

0

解決配額問題的「好方法」是消除任務隊列API的從指定到失敗的調用。

_name如果您提高任務隊列的執行速度,則每5秒使用一次可能不會成爲瓶頸的更改。但是您也可以使用_countdown添加任務。

+0

執行速度不是問題,這是由memcache解決的。 10個任務/秒就足夠了。問題是所有不必要的任務API調用的情況下,「除了」部分被擊中。 – Ragnar

相關問題