如何优雅地重新启动芹菜工人?

时间:2012-03-19 04:06:22

标签: django celery celeryd

在发布新版本以更新worker中的代码时,如何优雅地重新启动芹菜工作者?

修改 我打算做的是这样的事情。

  • 工作正在运行,可能会将100 MB文件上传到S3
  • 新版本
  • 工作人员代码已更改
  • 构建脚本向工作人员发出信号
  • 使用新代码启动新员工
  • 在完成现有工作退出后获得信号的工人。

8 个答案:

答案 0 :(得分:45)

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

记录了重新启动工作人员的新建议方法
$ 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://ask.github.com/celery/userguide/workers.html#restarting-the-worker,您可以重新启动发送HUP信号的工作人员

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

答案 1 :(得分:11)

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

答案 2 :(得分:4)

如果你要走kill路线,pgrep要救援:

kill -9 `pgrep -f celeryd`

请注意,这不是一项长期任务,如果它残酷地终止,我也不在乎。只是在开发期间重新加载新代码。如果它更敏感,我会去重启服务路线。

答案 3 :(得分:3)

你应该看看Celery的autoreloading

答案 4 :(得分:2)

我已经使用自动脚本反复测试了-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)

答案 5 :(得分:1)

您可以这样做:

芹菜多次重启w1 -A your_project -l info#重新启动工作者 enter link description here

答案 6 :(得分:0)

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

但目前无法做到这一点:https://groups.google.com/d/msg/celery-users/uTalKMszT2Q/-MHleIY7WaIJ

答案 7 :(得分:0)

可能会迟到。我使用:

sudo systemctl stop celery

sudo systemctl start celery

sudo systemctl status celery