当发布一个新构建以更新工作程序中的代码时,如何优雅地重启celery工作者?
编辑: 我的意图是做类似于这样的事情。
- 工作者正在运行,可能正在将100 MB文件上传到S3
- 新的构建出现
- 工作者代码已更改
- 构建脚本向工作者发送信号
- 使用新代码启动新工作者
- 接收到信号的工作者完成现有任务后退出。
ps auxww | grep celeryd | grep -v "grep" | awk '{print $2}' | xargs kill -HUP
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
kill -9 `pgrep -f celeryd`
请注意,这不是一个长时间运行的任务,如果它粗暴地终止我也不在意。只是在开发过程中重新加载新代码。如果更敏感的话,我会选择重新启动服务的方式。
我已经使用自动化脚本反复测试了-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)
docker-compose kill -s HUP celery
这里的 celery 是容器名称。工作进程将会优雅地重启,正在进行的任务不会被强制停止。
尝试过 pkill、kill、celery multi stop、celery multi restart、docker-compose restart 等方法,但都无法正常工作。要么容器被突然停止,要么代码没有重新加载。
我只想在生产服务器上手动重新加载我的代码,使用一行命令。不想与 daemonization 打交道。
或许有些晚了,但我使用以下命令:
sudo systemctl stop celery
sudo systemctl start celery
sudo systemctl status celery
Unit celery.service could not be found.
- egor83
celery multi
,但在守护进程部分,示例systemd配置文件使用了celery multi
。 - GDorn