我在 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 租约任务()块中。但是,上面提到的博客文章中的示例代码也使用 sleep() 暂停线程执行。示例代码在 github 中可用,链接在博客文章中(不幸的是我不能在这里发布)