【问题标题】:Is lease_tasks() in gae pull queues a blocking method?gae 拉队列中的lease_tasks() 是阻塞方法吗?
【发布时间】:2013-10-09 14:29:00
【问题描述】:

我在 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(唤醒-> 睡眠周期),而不仅仅是将线程块放在“队列”中(我知道 pull-queue 实际上是一个 RPC,但它抽象地仍然是一个生产者队列)

这可能只发生在开发应用程序服务器上,而在 GAE 租约任务()块中。但是,上面提到的博客文章中的示例代码也使用 sleep() 暂停线程执行。示例代码在 github 中可用,链接在博客文章中(很遗憾我不能在这里发布)

【问题讨论】:

    标签: google-app-engine task-queue pull-queue


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多