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

posted @ 2020-10-30 11:17  大略  阅读(2043)  评论(0)    收藏  举报