python - celery 工等待

标签 python celery

我正在使用 Celery 框架编写一个应用程序。我的一些任务非常繁重,可以执行很长时间。

我注意到,当我运行 5-6 个工作人员,然后放置 10-20 个任务时,它们可能会由工作人员随机分配,有时如果一个人没有任务,它不会启动剩余的任务,它们将由工作人员处理其他人仅在完成任务时(可能在几小时内)。如果我此时再运行一个工作程序 - 它什么也不做,但可以接受新任务。

这是一个错误还是一个功能?我该如何解决我的需求?当我们有空闲的 worker 并且没有开始任务时,等待几个小时是没有意义的。

最佳答案

这不是错误或功能(更可能是功能),它只是配置错误。

作为documentation说,工作人员可以为自己预留一些任务,以加快处理消息的速度。但这仅对于小而快速的任务才有意义 - 它不会向代理请求新消息,而是立即启动保留的消息。

但是对于长期任务,这可能会导致您问题中描述的情况。

If you have many tasks with a long duration you want the multiplier value to be 1, which means it will only reserve one task per worker process at a time.

If you have a combination of long- and short-running tasks, the best option is to use two worker nodes that are configured separately, and route the tasks according to the run-time.

因此,您需要在 celery 的设置中设置 CELERYD_PREFETCH_MULTIPLIER = 1

但是,

When using early acknowledgement (default), a prefetch multiplier of 1 means the worker will reserve at most one extra task for every active worker process.

When users ask if it’s possible to disable “prefetching of tasks”, often what they really want is to have a worker only reserve as many tasks as there are child processes.

我还可能建议设置CELERY_ACKS_LATE = True以仅在任务完成后发送ACK命令。这样,工作人员根本不会保留任何额外的任务,但当前正在执行的任务将被标记为仅保留。

尽管这有一个副作用 - 如果工作线程在执行任务的过程中崩溃/终止,则该任务将再次标记为未启动,并且任何其他工作线程都可以从头开始重新启动它。因此,请确保您拥有幂等任务。请参阅docs再次讨论这个。

关于python - celery 工等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39830235/

相关文章:

python - fig, ax = plt.subplots() 意思

python - 在 Jinja2 中执行算术运算

python - 优先考虑 celery 队列/任务

python - celery 如恶魔

python - 如何提取两个标记之间的子字符串?

python - 从 PyQt4 ListWidgetItem 获取所有数据

python - 哪些脚本会进入 Python 包的 bin 文件夹?

flask - 从 flask 应用程序动态添加定期任务

django - 将 Celery 任务日志直接保存到单个文件

python - 为 Django + Celery + RabbitMQ 预订?