Celery笔记

Celery 预取机制

Celery 默认启动预取机制,即如果有多个worker,会平均分配给多个worker,如果其中一个worker做了长时间耗时操作,则会影响已被预取的下一个task,为了避免此情况,可以在启动时加-Ofair取消预取机制, 这样就是执行完成一个,再取一个。
celery -A mytask worker --loglevel=info -Ofair
如果是在django里配置celery 需要在celery.py里添加如下内容, 启动的时候带上-Ofair

#  需要放在config_from_object调用之前, 否则不生效
app.conf.CELERY_ACKS_LATE = True
app.conf.CELERYD_CONCURRENCY = 1 # 可选
app.conf.CELERYD_PREFETCH_MULTIPLIER = 1

app.config_from_object('django.conf:settings', namespace='CELERY')

app.conf.CELERY_ACKS_LATE一定要放在config_from_object之前,否则不生效
可参考:https://stackoverflow.com/questions/16040039/understanding-celery-task-prefetching/33357180#33357180

windos和linux下celery的区别

  • windows无法用celery multi 后台命令
    原因是celery multi命令会调resource模块,windows没有该模块
  • 取消预存取机制区别
    都需要配置:
app.conf.CELERY_ACKS_LATE = True
app.conf.CELERYD_CONCURRENCY = 1 # 可选
app.conf.CELERYD_PREFETCH_MULTIPLIER = 1

windowns下启动:
celery -A mytask worker --loglevel=info -P eventlet -Ofair

linux下启动
celery -A mytask worker --loglevel=info -P eventlet

收不到broker消息问题

不管是Linux还是windows,启动的时候都要带-P eventlet,否则不能触发事件执行

你可能感兴趣的:(Celery笔记)