about
注意,celery的使用对系统环境、Python版本是有要求的;而且celery自己的版本也有区别,比如celery4.x和celery5.x就有一些区别。
所以你在学习时要注意这些,把环境、版本搞好了,才能正常使用。
本篇博客的环境是:
- Windows11。
- celery4.4.0,celery的版本不同对Python解释器版本也有不同的要求,注意查看官网:https://docs.celeryq.dev/en/4.4.2/changelog.html
- This version is officially supported on CPython 2.7, 3.5, 3.6, 3.7 & 3.8 and is also supported on PyPy2 & PyPy3.
- Python3.8.16,celery4.4.0对Python版本的要求是
CPython 2.7, 3.5, 3.6, 3.7 & 3.8
这几个版本,所以我这里用的是Python3.8,版本不配套会出现各种各样的问题,所以,多注意吧! - redis软件是3.0.7版本的,高版本的估计也没事,不过我没试。
- redis模块的版本是4.5.4,这个倒没发现啥问题。
- eventlet0.33.3,如果是Windows系统环境的话,还需要下载eventlet,我这里是0.33.3版本。
后续示例中,我都会贴出对应的环境及版本。
install
本地作为学习时,我的环境是win11,Python解释器的版本是3.8。所以我下载了如下几个模块:
bash
pip install celery==4.4.0
pip install redis==4.5.4
pip install eventlet==0.33.3
常见报错
AttributeError: 'Timer' object has no attribute 'isAlive'
win11 + Python3.8.16 + redis4.5.4(模块) + redis3.2(redis软件版本)
我在win11上执行如下命令报错:
bash
(py38) D:\tmp\celery_demo>celery worker -A s1 -l info
报错过程省略了....但最终爆了如下的错误
AttributeError: 'Timer' object has no attribute 'isAlive'
原因就是isAlive被弃用了,那么我们只需要该源码就行了。
源码文件位于site-packages\celery\utils\timer2.py
文件的约105行左右的def ensure_started(self):
方法中。按照如下方式修改。
ValueError: not enough values to unpack (expected 3, got 0)
win11 + Python3.8.16 + redis4.5.4(模块) + redis3.2(redis软件版本)
我在win11上执行如下命令报错:
bash
(py38) D:\tmp\celery_demo>celery worker -A s1 -l info
-------------- celery@zhangkai v4.4.0 (cliffs)
--- ***** -----
-- ******* ---- Windows-10-10.0.22621-SP0 2023-04-28 16:13:32
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app: tasks:0x14ebd932160
- ** ---------- .> transport: redis://127.0.0.1:6379//
- ** ---------- .> results: redis://127.0.0.1:6379/
- *** --- * --- .> concurrency: 32 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery
[tasks]
[2023-04-28 16:13:39,434: INFO/MainProcess] Received task: s1.xxxxxx[c06cc968-cb29-41b7-9bfa-7c6c6a32afc1]
[2023-04-28 16:13:39,486: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)')
Traceback (most recent call last):
File "C:\software\miniconda3\envs\py38\lib\site-packages\billiard\pool.py", line 362, in workloop
result = (True, prepare_result(fun(*args, **kwargs)))
File "C:\software\miniconda3\envs\py38\lib\site-packages\celery\app\trace.py", line 546, in _fast_trace_task
tasks, accept, hostname = _loc
ValueError: not enough values to unpack (expected 3, got 0)
经查Windows上运行命令还需要配合eventlet
模块,所以:
pip install eventlet
然后执行命令的时候加上-P eventlet
参数,即:
bash
# 原来的命令
celery worker -A s1 -l info
# 现在的命令
celery worker -A s1 -l info -P eventlet
然后执行就正常了。
参考: