美文网首页
Celery使用总结--evenlet

Celery使用总结--evenlet

作者: 最后一次被盗 | 来源:发表于2017-03-10 18:09 被阅读452次

问题:
worker中使用到while死循环来遍历任务,达到调度任务的目的,所以,在使用supervisor管理celery 的worker时,无法正常停止
解决:

  1. 使用信号机制
    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池子退出时调用
  2. 具体解决:
    由于worker是死循环,所以在第一次发送退出信号时,celery默认的是warm Shutdown,要等待worker执行完任务后退出,需要手动再发送一次Ctrl+C信号。
    此时,无论是[worker Signals],还是【Task Signals】都没有发送。所以要使用此时会发送的信号,通过Debug日志发现,此时发送了【Worker: Stopping Pool...】,
    也就是说,pool的信号应该是发送了,通过比对,应该是eventlet信号发送了,所以使用这个信号就ok了。
  3. 踩得小坑
    eventlet属于是第三方的信号机制,所以:
  4. 安装第三方库 eventlet
    2.在启动worker时,开启eventlet, -P eventlet

相关文章

网友评论

      本文标题:Celery使用总结--evenlet

      本文链接:https://www.haomeiwen.com/subject/iddogttx.html