Celery 提供了 control
模块,允许你发送控制命令给正在运行的 worker。其中 shutdown
命令可以用来关闭一个或多个 worker。下面是如何使用 control.shutdown
来关闭 worker 的详细说明。
使用 control.shutdown
1. 导入必要的模块
首先,你需要导入 Celery 应用实例和 control
模块。
from celery import Celery
from celery.bin import worker
from celery.app.control import Control
app = Celery('your_app_name')
control = app.control
2. 发送 shutdown
命令
你可以使用 control.shutdown
方法来关闭 worker。该方法接受一个可选的 destination
参数,用于指定要关闭的 worker 的名称或 ID。如果不指定,则默认关闭所有 worker。
# 关闭所有 worker
control.shutdown()
# 关闭特定 worker
control.shutdown(destination='worker_name_or_id')
示例代码
假设你有一个名为 your_app_name
的 Celery 应用,并且你想关闭所有的 worker:
from celery import Celery
app = Celery('your_app_name')
control = app.control
# 关闭所有 worker
control.shutdown()
如果你知道特定 worker 的名称或 ID,并且只想关闭那个 worker:
# 关闭特定 worker
control.shutdown(destination='worker_name_or_id')
注意事项
- worker 必须在线:
shutdown
命令只能发送给在线的 worker,如果 worker 不在线,那么命令不会起作用。 - worker 必须配置了控制命令:确保 worker 已经配置了接受来自控制命令的请求。通常情况下,这是默认启用的,但在某些配置下可能需要显式开启。
- 优雅关闭:
shutdown
命令会尝试优雅地关闭 worker,这意味着它会等待当前的任务完成后再关闭 worker。如果需要立即关闭而不等待任务完成,可以使用revoke
命令取消任务,然后关闭 worker。
示例:通过脚本关闭 worker
以下是一个完整的 Python 脚本示例,展示了如何编写一个脚本来关闭所有的 Celery worker:
from celery import Celery
app = Celery('your_app_name')
control = app.control
if __name__ == '__main__':
# 关闭所有 worker
control.shutdown()
print("All workers have been asked to shutdown.")
测试脚本
你可以通过启动一个 Celery worker 并运行上面的脚本来看是否能正常关闭 worker:
# 启动 Celery worker
celery -A your_app_name worker --loglevel=info
# 运行脚本关闭 worker
python shutdown_worker.py
总结
使用 control.shutdown
是一种简单有效的方式来关闭 Celery worker。通过发送 shutdown
命令,你可以根据需要关闭所有 worker 或者特定的 worker。这种方法适用于那些需要在运行时动态管理 worker 的场景。如果你有其他具体的问题或需要进一步的帮助,请随时告诉我!