我正在尝试限制一个芹菜任务的速度。这是我的做法:
from project.celery import app
app.control.rate_limit('task_a', '10/m')
它运作良好。但是,有一个问题。此辅助角色负责的其他任务也被阻止。
假设已经安排了 100task_a
。由于它是速率限制的,因此执行所有这些操作需要 10 分钟。在此期间,还安排了task_b
。在完成task_a
之前,它不会执行。
是否可以不阻止task_b
?
从外观上看,这就是它的工作原理。阅读文档后,我只是没有这种印象。
其他选项包括:
- 仅针对此任务分离工作线程和队列
- 向任务
task_a
添加eta
,以便将所有任务安排在夜间运行
在这种情况下,最佳做法是什么?
最简单的(无需编码(方法是将任务分离到自己的队列中,并为此目的运行一个专门的工作线程。
这并不可耻,有很多芹菜队列和工人是完全可以的,每个队列和工人都只致力于特定类型的工作。作为额外的好处,您可以更好地控制执行,如果需要,您可以轻松地打开/关闭工作人员以暂停某些流程等。
另一方面,让大量专业工作人员大部分时间处于空闲状态(等待特定作业排队(并不是特别节省内存。
因此,如果您需要对更多任务进行评级限制,并期望特定工作线程大部分时间处于空闲状态,您可以考虑提高效率并实施令牌桶。有了这个,你所有的工作线程都可以是通用的,你可以随着整体负载的增加自然地扩展它们,知道工作分配不会再被单个任务的速率限制所削弱。
这应该是任务声明的一部分,以基于每个任务工作。你通过的方式control
可能为什么它会对其他任务产生这种副作用
@task(rate_limit='10/m')
def task_a():
...
阅读更多后
请注意,这是每个辅助角色实例的速率限制,而不是全局速率限制。要强制实施全局速率限制(例如,对于每秒具有最大请求数的 API(,您必须限制为给定队列。
您可能必须在单独的队列中执行此操作