Celery使用总结--evenlet
2017-03-10 本文已影响452人
最后一次被盗
问题:
worker中使用到while死循环来遍历任务,达到调度任务的目的,所以,在使用supervisor管理celery 的worker时,无法正常停止
解决:
- 使用信号机制
celery的信号常用的三种:Task Signals Worker Signals Eventlet Signals 全量信号点我见
Task Signals (不需要外部依赖库):
例如: task_prerun worker运行前
task_success worker运行成功
task_failure worker运行失败
Worker Signals (不需要外部依赖库):
例如: worker_ready worker初始化完毕后 指的是MainProcess
worker_init worker初始化时 指的是MainProcess
worker_process_init worker初始化时 子worker
worker_process_shutdown worker退出时 子worker
Eventlet Signals (依赖外部库 eventlet)
例如: eventlet_pool_preshutdown worker池子退出时调用 - 具体解决:
由于worker是死循环,所以在第一次发送退出信号时,celery默认的是warm Shutdown,要等待worker执行完任务后退出,需要手动再发送一次Ctrl+C信号。
此时,无论是[worker Signals],还是【Task Signals】都没有发送。所以要使用此时会发送的信号,通过Debug日志发现,此时发送了【Worker: Stopping Pool...】,
也就是说,pool的信号应该是发送了,通过比对,应该是eventlet信号发送了,所以使用这个信号就ok了。 - 踩得小坑
eventlet属于是第三方的信号机制,所以: - 安装第三方库 eventlet
2.在启动worker时,开启eventlet, -P eventlet