【问题标题】:Celery: enqueuing multiple (100-1000) tasks at the same time via send_task?芹菜:通过send_task同时排队多个(100-1000)任务?
【发布时间】:2019-09-04 16:22:11
【问题描述】:

我们经常需要使用 Celery(由 RabbitMQ 支持)将许多消息排入队列(我们将它们分成 1000 个组)。有没有人有办法做到这一点?我们基本上是在尝试在一个send_task 呼叫中“批处理”一大组消息。

如果我猜的话,我们需要“更深入”一步并连接到kombu 甚至py-amqp

问候,
尼克拉斯

【问题讨论】:

    标签: python rabbitmq celery kombu


    【解决方案1】:

    无需“深入”并直接使用 Kombu。 - 适用于不同用例的解决方案很少:

    • 如果您更喜欢使用 Celery 工作流程,您可能希望利用 chunks

    • 没有什么能阻止您调用 send_task() 数千次。

    • 如果调用 send_task() 太慢,您可能需要使用一个线程池来同时将 N 个任务发送到队列。

    【讨论】:

    • 好点!我不想使用块,因为这些是大型任务(5-25 分钟的处理时间),这需要重新设计我们处理它们的方式。我会将其标记为答案,并使用池化连续调用 send_task。
    【解决方案2】:

    我 - 至少暂时 - 最终做的是确保保持 celery 连接打开,通过:

    with celery.Celery(set_as_current=False) as celeryapp:
        ...
        with celeryapp.connection_for_write(connect_timeout=connection_timeout) as conn:
            for message in messages:
                celeryapp.send_task(...)
    

    这样我就不必为每条消息重新创建连接。

    【讨论】:

      猜你喜欢
      • 2020-01-04
      • 2011-10-13
      • 2019-08-19
      • 2016-01-28
      • 2018-04-22
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      相关资源
      最近更新 更多