我在Google App Engine中有一个拉取队列和一个驻留后端,用于处理拉取队列中的任务。后端有几个工作线程用于消费和处理任务,如Google Cloud Platform博客中的帖子所示
https://cloud.google.com/resources/articles/ios-push-notifications
Workers使用lease_tasks()轮询pull-queue。我的问题是: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(唤醒 - >睡眠周期),而不仅仅是让线程阻塞在' queue'(我知道pull-queue实际上是一个RPC,但它抽象地保留了一个生成器队列)
在GAE lease_tasks()块中,这可能只发生在dev app服务器上。但是,上面提到的博客文章中的示例代码也使用sleep()暂停执行线程。示例代码在github中可用,并且链接在博客文章中(遗憾的是我无法在此处发布)
答案 0 :(得分:0)
lease_tasks
不会等待添加新任务。大多数任务队列调用最多需要5秒钟。租用任务和获取队列统计信息的调用需要更长时间 - 默认情况下最多10秒。
大多数用户不需要设置截止日期,它是一个可选参数。如果您有很多工作人员在同一队列上竞争并且经常在10秒后遇到暂时性错误,请考虑将租约期限增加到20秒(或者将负载分成更多队列和/或标记)。或者,如果您只有一名工作人员,除了租赁任务之外总是需要时间来执行其他工作,可以使用5秒的小截止日期,但是使用异步API要好得多。