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

     2023-02-16     248

关键词:

【中文标题】如何优雅地重启芹菜工人?【英文标题】:How do I restart celery workers gracefully? 【发布时间】:2012-04-03 15:04:24 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

你应该看看 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 还要注意,打开此标志会导致孤立进程运行,进而导致结果后端工作不正常 自动重载选项似乎已从 Celery 4 中删除【参考方案2】:

根据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 :-) 可以替换 grep celeryd | grep -v "grep" 与 grep [c]eleryd。只是说。 好像不是优雅重启吧?正如文档所说:“除了停止然后启动工人重新启动外,您还可以使用 HUP 信号重新启动工人,但请注意工人将负责重新启动自己,因此这很容易出现问题,不建议在生产中使用" 那么在生产环境中重新加载 Celery 以避免失败的最佳方法是什么? 对于 celery multi:“对于生产部署,您应该使用初始化脚本或其他过程监督系统”。至于 HUP:“这很容易出现问题,不建议在生产中使用 celery 文档在这个问题上似乎是自相矛盾的;这里它说不要在生产中使用celery multi,但在守护进程部分,示例systemd配置文件使用celery multi【参考方案3】:

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

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

【讨论】:

【参考方案4】:
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

【讨论】:

Uugh... 它在那里说“管理开发工作人员的最简单方法是使用 celery multi。对于生产部署,您应该正在使用 init 脚本或其他进程监督系统”。此答案不适用于在生产中运行! @webjunkie OP 没有说“在产品部署中”,所以不知道如果原始问题中没有提到它,你为什么要否决它。 他也没有说他想要一个解决方案,例如测试环境。很多人不会费心阅读更多内容,并且危险地使用他们认为正确的解决方案。因此,仅提及缺点是公平的,而不是简单地从文档中复制和粘贴某些内容而忽略注释并剥离进一步的建议。【参考方案5】:

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

【讨论】:

【参考方案6】:

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

kill -9 `pgrep -f celeryd`

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

【讨论】:

(pkill 以更简洁的方式执行此操作) 不知道。但是,我仍然更喜欢查看将被预先杀死的进程列表:第 1 步 - 调整您的 pgrep,第 2 步通过将其提供给 kill 将其武器化。【参考方案7】:

你可以这样做:

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

Example

【讨论】:

【参考方案8】:

聚会可能会迟到。我用:

sudo systemctl stop celery

sudo systemctl start celery

sudo systemctl status celery

【讨论】:

Unit celery.service could not be found.

如何停止芹菜工人进程

】如何停止芹菜工人进程【英文标题】:Howtostopceleryworkerprocess【发布时间】:2015-06-0102:45:27【问题描述】:我在UbuntuEC2节点上有一个Django项目,我一直使用它来使用Celery设置异步。我正在关注this以及文档。我已经能够在命令行... 查看详情

如何在不同的机器上设置芹菜工人?

】如何在不同的机器上设置芹菜工人?【英文标题】:Howtosetupceleryworkersonseparatemachines?【发布时间】:2012-05-0221:45:25【问题描述】:我是celery新手。我知道如何安装和运行一台服务器,但我需要将任务分发到多台机器上。我的项... 查看详情

如何使用芹菜工人将 django 项目部署到谷歌云?

】如何使用芹菜工人将django项目部署到谷歌云?【英文标题】:Howtodeployadjangoprojecttogooglecloudwithceleryworkers?【发布时间】:2021-05-0116:58:54【问题描述】:所以我有一个django项目,我为它安装了celery和herokuredis,并使用谷歌云进行... 查看详情

芹菜工人在 aws 弹性豆茎中失败 [退出:芹菜工人(退出状态 1;未预期)]

...】:2019-06-1923:48:12【问题描述】:我一直在尝试遵循有关如何将带有celeryworker的django应用程序部署到awselasticbeans 查看详情

芹菜。运行单个芹菜节拍 + 多个芹菜工人规模

】芹菜。运行单个芹菜节拍+多个芹菜工人规模【英文标题】:Celery.Runningsinglecelerybeat+multipleceleryworkersscale【发布时间】:2021-10-2402:29:41【问题描述】:有单一的芹菜节拍运行:celery-Aapp:celerybeat--loglevel=DEBUG还有三个跑过的工人:... 查看详情

如何优雅地重启 NodeJS 服务器?

】如何优雅地重启NodeJS服务器?【英文标题】:HowtogracefullyrestartaNodeJSserver?【发布时间】:2012-02-1413:55:16【问题描述】:目前,我的辅助项目的prod环境是一个gitrepo,我在其中提取一些代码,使用Ctrl-C手动终止服务器,然后手动... 查看详情

从芹菜任务中获取芹菜工人的名字?

】从芹菜任务中获取芹菜工人的名字?【英文标题】:Getthenameofceleryworkerfrominsideacelerytask?【发布时间】:2014-07-1410:52:13【问题描述】:我希望celery任务能够获取执行它的工作人员的名称,以用于记录目的。我需要从任务中处理... 查看详情

如何优雅地重启 django 在 nginx 后面运行 fcgi?

】如何优雅地重启django在nginx后面运行fcgi?【英文标题】:Howtogracefullyrestartdjangorunningfcgibehindnginx?【发布时间】:2010-09-2614:04:28【问题描述】:我正在使用fcgi连接的nginx后面运行一个django实例(通过使用manage.pyrunfcgi命令)。由... 查看详情

ping 芹菜工人

】ping芹菜工人【英文标题】:PingingaCeleryWorker【发布时间】:2014-08-1723:45:48【问题描述】:我有一个芹菜工人,它在由RabbitMQ代理的队列中工作。当任务被发送到这个队列时,就会发生各种疯狂的处理。我想向工作人员发送一条... 查看详情

如何在不延迟任务的情况下优雅地重启 Celery

】如何在不延迟任务的情况下优雅地重启Celery【英文标题】:HowtorestartCelerygracefullywithoutdelayingtasks【发布时间】:2012-03-2709:53:40【问题描述】:我们使用Celery和Djangowebapp来管理离线任务;其中一些任务可以运行长达120秒。每当我... 查看详情

从多处理开始芹菜工人

】从多处理开始芹菜工人【英文标题】:Startingceleryworkerfrommultiprocessing【发布时间】:2015-07-0415:34:27【问题描述】:我是芹菜新手。我见过的所有示例都从命令行启动celeryworker。例如:$celery-Aprojworker-linfo我正在启动一个关于弹... 查看详情

python芹菜greenlet工人死亡。(代码片段)

查看详情

芹菜工人并发

】芹菜工人并发【英文标题】:Celeryworkersconcurrency【发布时间】:2022-01-0805:20:30【问题描述】:我有一个Python脚本,它是一个celery任务。我的应用程序需要多个并发工作人员(来自同一个脚本),因为每个工作人员都需要按顺序... 查看详情

码头工人群或牧场牛中的芹菜工人

】码头工人群或牧场牛中的芹菜工人【英文标题】:Celeryworkersinadockerswarmorranchercattle【发布时间】:2017-07-2919:33:31【问题描述】:我有一个设计问题。我在几个主机上使用dockerizedceleryworkers。我在每台主机上只有一个celery容器实... 查看详情

芹菜不启动多个工人

】芹菜不启动多个工人【英文标题】:Celerydoesnotstartmultipleworkers【发布时间】:2018-07-1014:35:25【问题描述】:我正在尝试设置一个服务器以使用celery在Ubuntu上运行多个工作人员。使用通用脚本设置守护进程并使用rabbit-mq作为代理... 查看详情

VSCode调试芹菜工人

】VSCode调试芹菜工人【英文标题】:VSCodedebugCeleryworker【发布时间】:2020-01-0213:04:26【问题描述】:在运行了一些令人沮丧的日子之后,我需要查看在VSCode中调试celery工作进程。这遵循Celery文档中建议的创建消息处理程序的过程... 查看详情

禁用八卦、交际和心跳对芹菜工人有啥后果?

】禁用八卦、交际和心跳对芹菜工人有啥后果?【英文标题】:Whataretheconsequencesofdisablinggossip,mingleandheartbeatforceleryworkers?禁用八卦、交际和心跳对芹菜工人有什么后果?【发布时间】:2019-08-1011:08:33【问题描述】:禁用八卦、交... 查看详情

芹菜工人收到任务但没有执行

】芹菜工人收到任务但没有执行【英文标题】:Celeryworkerreceivedtaskbutnotexecuting【发布时间】:2019-08-0105:08:27【问题描述】:我尝试在windows10上使用celery=4.2.0、Python=3.6和Rabbitmq=3.7.9执行简单的任务,该任务已被工作人员接收但没有... 查看详情