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

Qui*_*Par 40 django celery celeryd

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

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

  • 工作正在运行,可能会将一个100 MB的文件上传到S3
  • 一个新的构建来了
  • 工作人员代码有变化
  • 构建脚本向工作人员发出信号
  • 使用新代码启动新工作人员
  • 在完成现有工作退出后获得信号的工人.

arm*_*nge 46

这里重新介绍了重新启动工作人员的新建议方法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
Run Code Online (Sandbox Code Playgroud)

根据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
Run Code Online (Sandbox Code Playgroud)

  • 它似乎不是一个优雅的重启,是吗?正如文档所说:"除了停止然后启动工作人员重新启动之外,您还可以使用HUP信号重新启动工作人员,但请注意工作人员将负责重新启动自身,因此这很容易出现问题,因此不建议在生产中使用"那么在生产中重新加载芹菜以避免失败的最佳方法是什么? (3认同)
  • `sudo ps auxww | grep celeryd | grep -v"grep"| awk'{print $ 2}'| sudo xargs kill -HUP`不包括grep :-) (2认同)
  • 你可以替换grep celeryd | grep -v"grep"和grep [c] eleryd.只是说. (2认同)
  • 对于 celery multi:“对于生产部署,您应该使用初始化脚本或其他流程监控系统”。至于 HUP:“这很容易出现问题,**不建议在生产中使用**” (2认同)

zen*_*ngr 12

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
Run Code Online (Sandbox Code Playgroud)

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

  • 呃...它就在那里说“管理*开发*工人的最简单方法是使用celery multi。对于**生产部署**,您应该使用*init脚本或其他流程监督系统*”。此答案不适用于在生产中运行! (2认同)
  • 他也没有说他想要一个例如测试环境的解决方案。很多人不会费心阅读更多内容,而是危险地去使用对他们来说正确的解决方案。因此,公平地提及缺点而不是简单地从文档中复制和粘贴某些内容而忽略注释并剥离进一步的建议。 (2认同)

cản*_*yễn 9

你可以做:

celery multi restart w1 -A your_project -l info  # restart workers
Run Code Online (Sandbox Code Playgroud)

例子


JL *_*ret 6

如果你要走这kill条路,pgrep 可以拯救你:

kill -9 `pgrep -f celeryd`
Run Code Online (Sandbox Code Playgroud)

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

  • (pkill 以更干净的方式做到这一点) (4认同)