48

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

编辑: 我打算做的是这样的事情。

  • Worker 正在运行,可能正在上传一个 100 MB 的文件到 S3
  • 一个新的构建来了
  • 工人代码有变化
  • 构建脚本向 Worker(s) 发出信号
  • 使用新代码启动新工作者
  • 完成现有工作退出后收到信号的工人。
4

8 回答 8

48

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

 ps auxww | grep celeryd | grep -v "grep" | awk '{print $2}' | xargs kill -HUP
于 2012-03-19T14:30:06.707 回答
14
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

于 2015-03-10T05:33:32.747 回答
5

如果您要走这kill条路,请 pgrep 进行救援:

kill -9 `pgrep -f celeryd`

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

于 2016-03-15T06:57:02.030 回答
4

你可以做:

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

例子

于 2019-06-05T11:40:43.867 回答
3

你应该看看 Celery 的自动重载

于 2012-03-19T11:37:43.143 回答
2

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

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

于 2013-05-23T14:49:14.170 回答
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)
于 2015-04-29T10:09:05.287 回答
-1

聚会可能迟到了。我用:

sudo systemctl stop celery

sudo systemctl start celery

sudo systemctl status celery

于 2021-01-06T21:35:26.510 回答