【问题标题】:Celery: number of workers vs concurrency芹菜:工人数量与并发性
【发布时间】:2017-10-03 10:29:38
【问题描述】:

有什么区别:

  1. 一名工作人员并发 4 或
  2. 两个工人,每个工人 2 个并发

对于同一个队列。

谢谢

【问题讨论】:

    标签: concurrency celery web-worker django-celery celeryd


    【解决方案1】:

    我假设您在同一台机器上运行两个工人。在这种情况下,我建议您为队列维护一名工作人员。

    • 同一队列的两个工人对您没有任何好处。这只会增加内存浪费。
    • 当您有多个队列时需要两个或更多工作人员,以保持优先级或为每个工作人员分配不同数量的核心。
    • 一个队列有两个或多个工人如果您在不同的机器上运行工人,这很有用。不同机器上的工作人员从同一个队列中消费任务,您可以根据每台机器上可用的内核分配并发。

    我确实意识到我在 2 年多之后才做出回应。但我只是想我会把它放在这里给任何仍然有类似疑问的人。

    【讨论】:

    • 关于第一个项目符号的更多细节?我有两个工人在消费同一个队列,而且它似乎工作得很好,到底有什么缺点?或者为什么没有上升空间?为什么队列会关心它有多少消费者?
    • 我认为他们的意思是同一个 core 上的两个工人,这意味着工人会在 python 中使用上下文切换,就像假线程一样。但即便如此,它也会加速任务所具有的任何网络相关层,因为它们必须在 tcp 中等待。所以他们的第一点是完全不正确的,除非我遗漏了其他东西。
    【解决方案2】:

    有趣的问题。

    我能想到的事情(我相信还有很多):

    • 为了获得高可用性:
      1. 您需要不止一台机器(如果一台出现故障) - 因此您必须在每台机器上使用 worker。
      2. 即使对于一台机器 - 我认为让 2 个工作人员在两个不同的进程中运行而不是一个具有高并发性的工作人员更安全(如果我错了,请纠正我,但我认为它是通过线程实现的)。李>
    • docs 中,我看到他们建议使用每个 CPU 的并发性。
    • 如果您想将不同的任务分配给不同的工作人员..

    当然,您需要为此付出代价:更多进程占用更多资源(CPU/内存等)。

    我发现这个question 非常相似。

    【讨论】:

    • 感谢您的回答