Google App Engine 任务队列是如何工作的?

26 投票
2 回答
1607 浏览
提问于 2025-04-16 11:32

我对使用队列执行任务有点困惑。我看过文档,原以为我理解了“bucket_size”(桶大小)和“rate”(速率),但是当我把20个任务发送到设置为每小时5个、大小为5的队列时,所有20个任务却是一个接一个地尽快执行,最后在不到1分钟内就完成了。

deferred.defer(spam.cookEggs, 
               egg_keys, 
               _queue="tortoise")  

- name: tortoise
  rate: 5/h  
  bucket_size: 5  

我想要的是,无论我创建10个还是100个任务,我只希望每小时运行5个任务。所以20个任务大约需要4个小时才能完成。我希望它们的执行时间能够分散开来。

更新

问题在于,我以为在本地运行时会遵循任务执行速率的规则,但事实并非如此。你无法在本地测试执行速率。当我部署到生产环境时,我设置的速率和桶大小就按我预期的那样执行了。

2 个回答

-1

你想把 bucket_size 设置为 1,不然你会看到像之前那样的“突发”排队活动。

根据文档

bucket_size

这个设置限制了队列处理的突发性,也就是说,设置一个更大的 bucket_size 会让队列的执行速度出现更大的波动。举个例子,假设一个队列的处理速度是每秒5个任务,bucket_size是10。如果这个队列有一段时间没有活动(这时候它的“令牌桶”会慢慢填满),然后突然有20个任务被加入队列,它会立即执行10个任务。但是在接下来的那一秒里,只能再执行5个任务,因为令牌桶已经用完了,它会按照每秒5个的速度重新填充。

7

应用开发服务器不会遵循执行速度的设置。这个问题在正式环境中是不会出现的。

[这个回答是由Nick Johnson和/或提问者发现的;在这里以社区维基的形式发布,这样我们就有了可以被标记为接受的内容]

撰写回答