2013-10-09 34 views
0

我在Google App Engine中有一個拉隊列,並有一個駐留後端處理拉隊列中的任務。後端有消耗和處理任務的多個工作線程,如在谷歌雲平臺博客gae中的lease_tasks()是否阻塞了一個阻塞方法?

https://cloud.google.com/resources/articles/ios-push-notifications

後建議工人輪詢拉隊列lease_tasks()。我的問題是:lease_tasks()應該是一個阻塞方法,即阻止當前線程的執行,直到隊列中有一些任務或者超過了截止時間?

按照GAE文檔

https://developers.google.com/appengine/docs/python/taskqueue/overview-pull#Python_Leasing_tasks

lease_tasks()接受一個「期限」參數,並且可以提高DeadlineExceededError,因而是不理性假設lease_tasks()塊最多「截止」秒?

問題是,當我在開發服務器中開發應用程序時,lease_tasks()立即返回空任務列表。結果是工作線程的while循環不斷地調用lease_tasks(),從而消耗100%的CPU。如果我把明確的睡眠時間(比如說5秒)置於睡眠狀態,並且在同時將任務放入隊列中時不會醒來。這會讓工作人員反應遲鈍(最糟糕的情況下,處理下一個任務可能需要大於5秒),而且我會消耗更多的CPU(喚醒 - >睡眠週期),而不是隻讓線程塊處於「隊列」 (我知道拉隊實際上是一個RPC,但它抽象地仍然是一個生產者隊列)

也許只有在GAE lease_tasks()塊中的開發應用程序服務器纔會發生這種情況。但是,上面提到的博客文章中的示例代碼也會使用sleep()暫停執行線程。示例代碼在github中可用,鏈接在博客文章中(不幸的是我無法在此發佈)

回答

0

lease_tasks不等待新任務添加。大多數任務隊列調用最多需要5秒。租用任務和獲取隊列統計信息的調用需要更長時間 - 默認情況下最多爲10秒。

大多數用戶不需要設置截止日期,它是一個可選參數。如果您有很多員工在同一隊列上競爭,並且經常在10秒後遇到瞬時錯誤,請考慮將租期截止時間增加到20秒(或將負載分成更多隊列和/或標籤)。或者,如果您只有一名工作人員,並且除了租用任務外,還需要時間來執行其他工作,則可以使用5秒的小截止日期,但使用async API會更好。