我在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中可用,鏈接在博客文章中(不幸的是我無法在此發佈)