windows 运行 celery 的坑
celery
在4.x版本不再支持 windows 环境,在 windows 环境下运行,会出现ValueError: not enough values to unpack (expected 3, got 0)
的报错,可行的解决方案有两种:
- 设置环境变量
FORKED_BY_MULTIPROCESSING=1
,完美解决问题(推荐)。吐槽一句,网上搜索到的 90% 的解决办法都是建议用eventlet
甚至solo
,实际上这个celery
核心成员在 issues#4081 中提到的方法才是最优解。 - 使用
eventlet
作为并发模型,需要注意由于eventlet
和gevent
使用了猴子补丁,所以使用过程中可能出现一些难以解决的奇怪问题,特别是不一定支持某些第三方模块的使用。官方文档强调不要用配置文件的方式指定eventlet
和gevent
,而是用启动命令-P
,以免太迟应用猴子补丁而导致一系列奇怪问题。
时区问题
celery
默认时区为UTC
,比国内晚8个小时,需要配置时区:1
2enable_utc = True # 默认为 True
timezone = 'Asia/Shanghai'
如果不修改时区的话,会影响定时任务和Flower
内的时间显示。
Worker BrokenPipeError 问题
在使用celery==4.3.0 kombu==4.6.3 amqp==2.5.0 redis==3.2.1
时,出现 worker 退出的情况,日志显示抛出BrokenPipeError
的异常,根据 issues#3773 ,应该是个尚未解决的 bug。建议用系统服务或守护进程的方式启动 worker 进程,保证进程抛出异常退出后能够重新启动。