使用 Celery 踩过的坑

windows 运行 celery 的坑

celery在4.x版本不再支持 windows 环境,在 windows 环境下运行,会出现ValueError: not enough values to unpack (expected 3, got 0)的报错,可行的解决方案有两种:

  1. 设置环境变量FORKED_BY_MULTIPROCESSING=1,完美解决问题(推荐)。吐槽一句,网上搜索到的 90% 的解决办法都是建议用eventlet甚至solo,实际上这个celery核心成员在 issues#4081 中提到的方法才是最优解。
  2. 使用eventlet作为并发模型,需要注意由于eventletgevent使用了猴子补丁,所以使用过程中可能出现一些难以解决的奇怪问题,特别是不一定支持某些第三方模块的使用。官方文档强调不要用配置文件的方式指定eventletgevent,而是用启动命令-P,以免太迟应用猴子补丁而导致一系列奇怪问题。

时区问题

celery默认时区为UTC,比国内晚8个小时,需要配置时区:

1
2
enable_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 进程,保证进程抛出异常退出后能够重新启动。