我尝试使用redis后端在Windows上运行Celery示例。代码如下所示:
from celery import Celery
app = Celery('risktools.distributed.celery_tasks',
backend='redis://localhost',
broker='redis://localhost')
@app.task(ignore_result=False)
def add(x, y):
return x + y
@app.task(ignore_result=False)
def add_2(x, y):
return x + y
我使用 iPython 控制台启动任务:
>>> result_1 = add.delay(1, 2)
>>> result_1.state
'PENDING'
>>> result_2 = add_2.delay(2, 3)
>>> result_2.state
'PENDING'
似乎这两个任务都没有执行,但 Celery worker 输出显示它们成功了:
[2014-12-08 15:00:09,262: INFO/MainProcess] Received task: risktools.distributed.celery_tasks.add[01dedca1-2db2-48df-a4d6-2f06fe285e45]
[2014-12-08 15:00:09,267: INFO/MainProcess] Task celery_tasks.add[01dedca1-2db2-48df-a4d6-2f06fe28
5e45] succeeded in 0.0019998550415s: 3
[2014-12-08 15:00:24,219: INFO/MainProcess] Received task: risktools.distributed.celery_tasks.add[cb5505ce-cf93-4f5e-aebb-9b2d98a11320]
[2014-12-08 15:00:24,230: INFO/MainProcess] Task celery_tasks.add[cb5505ce-cf93-4f5e-aebb-9b2d98a1
1320] succeeded in 0.010999917984s: 5
我试图根据 Celery 文档解决此问题,但没有一个建议有用。我做错了什么,我如何从芹菜任务中获得结果?
上级:我添加了一个没有参数ignore_result
任务,但没有任何变化
@app.task
def add_3(x, y):
return x + y
>>>r = add_3.delay(2, 2)
>>>r.state
'PENDING'
根据芹菜"入门"无法检索结果; 始终挂起,https://github.com/celery/celery/issues/2146 这是一个 Windows 问题。
芹菜-P threads
或--pool=solo
选项解决了这个问题。
不要Celery --pool=solo
选项,而是尝试在Windows上-P threads
。
设置CELERY_TASK_TRACK_STARTED = True
(或track_started=True)也可以提供帮助 - 这将启用STARTED状态。
从芹菜文档中删除ignore_result=False
Task.ignore_result
Don’t store task state. Note that this means you can’t
use AsyncResult to check if the task is ready, or get its return value.
谢谢大家。
我的芹菜配置:
-------------- celery@DESKTOP-FD38GOO v4.4.2 (cliffs)
--- ***** -----
-- ******* ---- Windows-10-10.0.18362-SP0 2020-04-17 06:58:18
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app: mysite:0x25cfd40d208
- ** ---------- .> transport: redis://localhost:6379//
- ** ---------- .> results: redis://localhost:6379/1
- *** --- * --- .> concurrency: 8 (thread)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery
[tasks]
. mysite.celery.debug_task
. supplier.tasks.add
. supplier.tasks.count_widgets
. supplier.tasks.count_widgets2
. supplier.tasks.mul
. supplier.tasks.xsum
我已经解决了这样的问题:
我等待此类问题大约 1 天,并尝试卸载 Redis 并在 Windows 10 上安装 Redis 几次。
最后我发现没有并发配置。
第一个解决方案:
芹菜 -我的网站工人 -l 信息 -P 线程
第二种解决方案:
芹菜 -我的网站工人 -l 信息 --pool=solo
我的芹菜配置:
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/1'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_IGNORE_RESULT = False
CELERY_TIMEZONE = TIME_ZONE
CELERY_TRACK_STARTED = True
CELERYD_LOG_FILE = os.path.join(
BASE_DIR, 'celery', 'logs')
CELERYD_LOG_LEVEL = "INFO"
如果您从 Celery 对象设置配置,则采用其他方法 -
app = Celery("MyTasks")
app.conf.task_track_started = True
app.conf.task_ignore_result = False
..
..