【发布时间】:2012-04-03 15:04:24
【问题描述】:
在发布新版本以更新工作人员中的代码时,如何优雅地重新启动 celery 工作人员?
编辑: 我打算做的是这样的事情。
- Worker 正在运行,可能正在向 S3 上传一个 100 MB 的文件
- 新版本来了
- 工人代码有变化
- 构建脚本向 Worker 发出信号
- 使用新代码启动新工作人员
- 在完成现有作业退出后收到信号的工人。
【问题讨论】:
在发布新版本以更新工作人员中的代码时,如何优雅地重新启动 celery 工作人员?
编辑: 我打算做的是这样的事情。
【问题讨论】:
你应该看看 Celery 的autoreloading
【讨论】:
This is an experimental feature intended for use in development only, using auto-reload in production is discouraged as the behavior of reloading a module in Python is undefined
根据https://docs.celeryproject.org/en/master/userguide/workers.html#restarting-the-worker,你可以通过发送 HUP 信号来重启一个worker
ps auxww | grep celeryd | grep -v "grep" | awk '{print $2}' | xargs kill -HUP
【讨论】:
sudo ps auxww | grep celeryd | grep -v "grep" | awk '{print $2}' | sudo xargs kill -HUP 排除 grep :-)
celery multi,但在守护进程部分,示例systemd配置文件使用celery multi。
长时间运行的任务会发生什么?我喜欢这样:长时间运行的任务应该完成他们的工作。不要打断他们,只有新任务才能获得新代码。
但目前这是不可能的:https://groups.google.com/d/msg/celery-users/uTalKMszT2Q/-MHleIY7WaIJ
【讨论】:
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
【讨论】:
我已经使用自动化脚本反复测试了 -HUP 解决方案,但发现大约 5% 的时间,工人在重新启动后停止接受新工作。
更可靠的解决方案是:
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)
【讨论】:
如果您要走kill 路线,请 pgrep 进行救援:
kill -9 `pgrep -f celeryd`
请注意,这不是一项长期运行的任务,我不在乎它是否会残酷地终止。只是在开发期间重新加载新代码。如果它更敏感,我会走重启服务路线。
【讨论】:
【讨论】:
聚会可能会迟到。我用:
sudo systemctl stop celery
sudo systemctl start celery
sudo systemctl status celery
【讨论】:
Unit celery.service could not be found.