在不阻止其他任务的情况下限制芹菜任务的速率



我正在尝试限制一个芹菜任务的速度。这是我的做法:

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(,您必须限制为给定队列。

您可能必须在单独的队列中执行此操作

相关内容

  • 没有找到相关文章

最新更新