簡體   English   中英

gae pull隊列中的lease_tasks()是阻塞方法嗎?

[英]Is lease_tasks() in gae pull queues a blocking method?

我在Google App Engine中有一個提取隊列,並且有一個居民后端,可以處理提取隊列中的任務。 后端具有多個用於處理和處理任務的工作線程,如Google Cloud Platform博客中的帖子所述

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()接受一個'deadline'參數,並可能引發DeadlineExceededError,因此,不以為您認為lease_tasks()最多阻塞'deadline'秒是不合理的嗎?

問題是,當我在開發服務器中開發應用程序時,lease_tasks()立即返回並帶有空任務列表。 結果是工作線程的while循環不斷地調用lease_tasks(),從而消耗了100%的CPU。 如果我放置一個明確的sleep(),例如說5秒鍾,這將使工作人員進入睡眠狀態,並且如果同時將任務放入隊列中,則不會醒來。 這將使工作人員的響應速度較慢(最壞的情況是,可能需要-> 5秒才能處理下一個任務),再加上我將消耗更多的CPU(喚醒->睡眠周期),而不僅僅是將線程塊放在“隊列”中(我知道拉入隊列實際上是一個RPC,但是它抽象地仍然是生產者隊列)

也許只有在GAE lease_tasks()塊中,開發應用程序服務器才會發生這種情況。 但是,上述博客文章中的示例代碼也通過sleep()暫停了線程執行。 示例代碼在github中可用,並且鏈接在博客文章中(不幸的是,我無法在此處發布)

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

大多數用戶不需要設置截止日期,這是一個可選參數。 如果您有很多工作人員在同一個隊列中競爭,並且經常在10秒后遇到短暫錯誤,請考慮將租約期限延長到20秒(或將負載分攤到更多隊列和/或標簽上)。 或者,如果您只有一個工人,並且除了租賃任務之外,它總是需要時間來執行其他工作,則可以使用5秒鍾之類的最后期限,但是最好使用異步API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM