0

我在 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 中可用,链接在博客文章中(不幸的是我不能在这里发布)

4

1 回答 1

0

lease_tasks不等待添加新任务。大多数任务队列调用最多需要 5 秒。租用任务和获取队列统计信息的调用需要更长的时间 - 默认情况下最多 10 秒。

大多数用户不需要设置截止日期,它是一个可选参数。如果您有很多工作人员在同一个队列上竞争,并且经常在 10 秒后遇到瞬时错误,请考虑将租用期限增加到 20 秒(或将负载分片到更多队列和/或标签上)。或者,如果您只有一个工作人员,并且除了租用任务之外,它总是需要时间来执行其他工作,则可以使用 5 秒这样的小期限,但使用异步 API 会更好。

于 2013-10-09T19:39:54.843 回答