Celery任务state在Windows开发时一直处于"Pending"的解决方法
一、开发平台
Python:3.8.3
Celery:5.0.1
Redis:5.0.7
OS: Windows 10 64bit
二、遇到问题
程序代码: main.py
from __future__ import absolute_import
from celery import Celery
app = Celery('main',
broker='redis://127.0.0.1:6379/10',
backend='redis://127.0.0.1:6379/11')
@app.task
def print_hi(name):
print(f'Hi, {name}')
if __name__ == '__main__':
res = print_hi.delay("Hello")
根据官方文档在CMD 启动Celery Worker
celery -A main worker -l info
会得到返回结果:
--- ***** -----
-- ******* ---- Windows-10-10.0.18362-SP0 2020-10-30 10:44:37
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app: main:0x2572a8cd460
- ** ---------- .> transport: redis://127.0.0.1:6379/10
- ** ---------- .> results: redis://127.0.0.1:6379/11
- *** --- * --- .> concurrency: 8 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery
[tasks]
. main.print_hi
[2020-10-30 10:44:37,714: INFO/MainProcess] Connected to redis://127.0.0.1:6379/10
[2020-10-30 10:44:37,744: INFO/MainProcess] mingle: searching for neighbors
在Python的控制台调用main中print_hi
>>>from main import print_hi
>>>res2 = print_hi.delay("Hello")
查看任务状态会发现一直处在"PENDING状态"
>>>res2.state
'PENDING'
>>>res2.state
'PENDING'
查看任务的ready()也是一直False, 因此可知任务进入任务队列后未正常执行。
查阅官方文档对于任务一直处于[Pending]状态的描述,与本地环境并不相符。
后来通过在网上搜索一番,终于在这里找到了解决方法

即在启动Celery worker时指定-P threads
celery -A main worker -l info -P threads
这个时候在Python控制台再调用方法, 就可以看到state已经变成'SUCCESS', 也能正常获取结果了。
>>>res_new = print_hi.delay("Hello 2nd")
>>>res_new.state
'SUCCESS'
[2020-10-30 10:59:13,540: INFO/MainProcess] Received task: main.print_hi[52891d12-0c53-4ca4-9415-d2febb54a5f0]
[2020-10-30 10:59:13,541: WARNING/MainProcess] Hi, Hello 2nd

浙公网安备 33010602011771号