Skip to content

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):方法中。按照如下方式修改。

1832669301102870528.png

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

然后执行就正常了。

参考: