如何优雅地重启celery工人?

问题描述 投票:0回答:10

在发布新版本以更新工作人员中的代码时,如何优雅地重新启动 celery 工作人员?

编辑: 我想做的就是这样的事情。

  • Worker 正在运行,可能正在上传一个 100 MB 的文件到 S3
  • 新版本来了
  • Worker 代码有变化
  • 构建脚本向 Worker 发出信号
  • 使用新代码启动新工人
  • 完成现有作业退出后收到信号的工人。
django celery celeryd
10个回答
51
投票

根据https://docs.celeryq.dev/en/stable/userguide/workers.html#restarting-the-worker您可以通过发送HUP信号来重新启动工作人员

 ps auxww | grep celeryd | grep -v "grep" | awk '{print $2}' | xargs kill -HUP

15
投票
celery multi start 1 -A proj -l info -c4 --pidfile=/var/run/celery/%n.pid
celery multi restart 1 --pidfile=/var/run/celery/%n.pid

http://docs.celeryproject.org/en/latest/userguide/workers.html#restarting-the-worker


9
投票

你可以这样做:

celery multi restart w1 -A your_project -l info  # restart workers

示例


6
投票

如果你要走

kill
路线,pgrep 可以拯救你:

kill -9 `pgrep -f celeryd`

请注意,这不是一个长期运行的任务,我不在乎它是否会残酷终止。只需在开发期间重新加载新代码即可。如果它更敏感的话,我会选择重新启动服务路线。


2
投票

你应该看看 Celery 的 autoreloading


2
投票

长时间运行的任务会发生什么?我喜欢这样:长时间运行的任务应该完成其工作。不要打断它们,只有新任务才应该获取新代码。

但目前这是不可能的:https://groups.google.com/d/msg/celery-users/uTalKMszT2Q/-MHleIY7WaIJ


2
投票

我使用自动化脚本反复测试了-HUP解决方案,但发现大约5%的时间,worker在重新启动后停止拾取新作业。

更可靠的解决方案是:

stop <celery_service>

start <celery_service>

我已经使用了数百次,没有任何问题。

在 Python 中,您可以运行:

import subprocess
service_name = 'celery_service'
for command in ['stop', 'start']:
    subprocess.check_call(command + ' ' + service_name, shell=True)

0
投票

如果您使用 docker/docker-compose 并将 celery 放入与 Django 容器不同的容器中,则可以使用

docker-compose kill -s HUP celery

,其中 celery 是容器名称。工作线程将被优雅地重新启动,并且正在进行的任务不会被残酷地停止。

尝试过 pkill、kill、celery 多次停止、celery 多次重新启动、docker-compose 重新启动。全部不工作。要么容器突然停止,要么代码没有重新加载。

我只想使用 1-liner 在产品服务器中手动重新加载我的代码。不想玩守护进程


0
投票

使用 TERM 信号 如医生所说

kill -TERM <celerypid>

这将导致 celery 热关机。它停止接受新任务并在当前所有作业完成后退出。


-3
投票

参加聚会可能会迟到。我用:

sudo systemctl stop celery

sudo systemctl start celery

sudo systemctl status celery

© www.soinside.com 2019 - 2024. All rights reserved.