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
,否则不能触发事件执行
网友评论