【问题标题】:Wait for current task to complete before stopping celery在停止 celery 之前等待当前任务完成
【发布时间】:2020-05-19 09:21:04
【问题描述】:

我创建了一个运行 celery 的 systemd 进程。我已将并发设置为 1,因为我需要在先进先出 (FIFO) 队列上运行任务。

如果我需要停止 celery 进行一些维护,如何让 celery 等待当前正在运行的任务完成后再停止?我不希望它等待整个队列完成。我只需要 celery 在 celery 本身停止之前等待当前任务完成运行。

这是我的 systemd 服务文件

[Unit]
Description=celery daemon
After=network.target

[Service]
User=<username>
Group=<group>
WorkingDirectory=/path_to_django_project/project_name
ExecStart=celery -A project_name worker --concurrency=1

[Install]
WantedBy=multi-user.target

【问题讨论】:

    标签: django redis celery systemd django-celery


    【解决方案1】:

    这正是正在发生的事情。 - 当你发起优雅关闭时,Celery worker 会退订队列,等待自己的worker 进程执行的任务完成,然后关闭。

    另外,您的 ExecStart 行不正确。并发设置使用-c--concurrency 设置。这是工人帮助的引述:

    -c 并发,--并发并发 处理队列的子进程数。 默认值是系统上可用的 CPU 数量。

    并发等于 1 似乎是错误的,除非你的 Celery worker 运行的机器是单核的。

    Celery 文档的守护进程部分解释了如何使用 systemd,an example

    【讨论】:

    • 谢谢,我已经编辑了问题中的--concurrency
    • 由于某种业务需求,我们将并发保持到 1
    • 所以如果我执行 'sudo systemctl stop celery',会算作正常关机吗?
    • 取决于您在 ExecStop 中放入的内容。文档中的示例实际上是一个优雅的关闭。