小编典典

了解Celery任务预取

python

我刚刚发现了有关配置选项CELERYD_PREFETCH_MULTIPLIERdocs)的信息。默认值为4,但是(我相信)我希望预取尽可能少。我现在将其设置为1,这与我要查找的值足够接近,但是仍有一些我不理解的地方:

  1. 为什么这样预取一个好主意?我并没有真正找到原因,除非消息队列和工作线程之间存在大量延迟(就我而言,它们当前正在同一主机上运行,​​最糟糕的是最终可能在同一数据中的不同主机上运行)中央)。该文档仅提到了缺点,但没有解释优点是什么。

  2. 许多人似乎将此设置为0,期望能够以这种方式关闭预取功能(我认为这是一个合理的假设)。但是,0表示无限的预取。为什么有人会想要无限的预取,而这并不能完全消除您最初为任务队列引入的并发/异步性呢?

  3. 为什么不能关闭预取?在大多数情况下,关闭性能可能不是一个好主意,但是有没有技术上的理由无法做到这一点?还是只是没有实施?

  4. 有时,此选项连接到CELERY_ACKS_LATE。例如。罗杰·胡(Roger Hu)写道«[…]通常,[用户]真正想要的是让一个工人只保留与子进程一样多的任务。但是,如果不启用较晚的确认,就不可能做到这一点[…]»我不明白这两个选项是如何连接的,以及为什么一个选项不能没有另一个选项是不可能的。可以在这里找到有关连接的另一个提示。有人可以解释为什么两个选项连接在一起吗?


阅读 346

收藏
2020-12-20

共1个答案

小编典典

  1. 预取可以提高性能。工人无需等待来自代理的下一条消息即可处理。与代理进行一次通信并处理大量消息可提高性能。与本地内存访问相比,从代理(甚至从本地代理)获取消息的成本很高。还允许工人分批确认消息

  2. 将预取设置为零意味着“没有特定限制”,而不是无限

  3. 据记载,将预取设置为1等同于将其关闭,但这并非总是如此(请参阅:
    只是警告:在对Redis经纪人+ Celery 3.1.15进行测试时,我阅读的有关CELERYD_PREFETCH_MULTIPLIER = 1禁用预取的所有建议显然都是错误的。

为了证明这一点:

  1. CELERYD_PREFETCH_MULTIPLIER = 1
  2. 排队5个任务,每个任务将花费几秒钟的时间(例如,time.sleep(5))
  3. 开始在Redis中观察任务队列的长度: watch redis-cli -c llen default

  4. 开始 celery worker -c 1

  5. 请注意,Redis中的队列长度将立即从5降至3``CELERYD_PREFETCH_MULTIPLIER = 1 `不会阻止预取,它只是将预取限制为每个队列1个任务。

-Ofair,尽管文档中说什么,也不会阻止预取。

除了修改源代码外,我还没有找到完全禁用预取的任何方法。

  1. 预取允许分批确认消息。CELERY_ACKS_LATE =当邮件到达工作人员时,True阻止确认邮件
2020-12-20