学习celery时遇到的坑
1. 报错信息
def _connparams(self, async=False, _r210_options=(
^
SyntaxError: invalid syntax
原因: async 在 python3.7已经是关键字了,但是celery4.4.6版本没有更新导致的。此问题将在下一个版本修复。
解决办法:1. 将celery文件中的async命名为其他变量名/ 或者降低python版本3.7之下的
2. 在python3.8版本之后,python 中的kombu中的async 已经改变名称了
2.
from kombu.async.timer import Entry, Timer as Schedule, to_timestamp, logger
^
SyntaxError: invalid synta
同上
3. 启动worker 后执行task报错
tasks, accept, hostname = _loc
ValueError: not enough values to unpack (expected 3, got 0)
解决办法:在win10环境下运行celery4.x会出现此问题。先通过pip install eventlet
安装eventlet,然后启动worker时添加一个参数:
celery worker <module> worker -l INFO -P eventlet
4. 使用redis作为borker时
ERROR/MainProcess] Unrecoverable error: AttributeError("'str' object has no attribute 'items'",)-bug
原因: redis版本过高当时redis版本是3.5.3
解决办法:降低redis版本到2.10.6
5. celery定时任务,在运行生产者和工作者后,定时任务不执行,不报错,看不到任何情况。
原因: 运行命令
celery -A 任务文件名称(celery配置文件所在的位置,可以放在某个文件夹下但是得加 文件夹名称.celery配置) beat -l info
celery -A 任务文件名称 worker -l info
-l info 的打印信息,不会打印信息,应使用测试debug
解决办法: celery -A 任务文件名称 beat -l debug
celery -A 任务文件名称 worker -l debug
6. celery执行异步任务的时候,不能传输对象
原因:因为异步执行的时候,celery执行python代码,对象没有缓存,所以celery找不到对象
7. celery执行定时任务的时候,需要传参数,参数有限制,只能传int类型和str类型
8. RuntimeError: 'path' must be None or a list, not <class '_frozen_importlib_external._NamespacePath'>
运行celery worker 时出现的错误, 因为celery中autodiscover_task
会去扫描每一个注册的app底下的__init__.py
文件,可能你注册的APP文件中缺少__init__.py文件。
添加上__init__.py文件就可以了。