芹菜任务总是待命

Iva*_*mov 6 python windows redis celery

我尝试在Windows上使用redis后端运行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
Run Code Online (Sandbox Code Playgroud)

我使用iPython控制台启动任务:

>>> result_1 = add.delay(1, 2)    
>>> result_1.state
'PENDING'
>>> result_2 = add_2.delay(2, 3)    
>>> result_2.state
'PENDING'
Run Code Online (Sandbox Code Playgroud)

似乎两个任务都没有执行,但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
Run Code Online (Sandbox Code Playgroud)

我根据Celery文档试图解决这个问题,但没有一个建议是有用的.我做错了什么,如何从Celery任务中获得结果?

UPD: 我添加了一个没有ignore_result参数的任务,但没有任何改变

@app.task
def add_3(x, y):
    return x + y

>>>r = add_3.delay(2, 2)
>>>r.state
'PENDING'
Run Code Online (Sandbox Code Playgroud)

Iva*_*mov 11

加入芹菜'入门'无法检索结果; 总是待定https://github.com/celery/celery/issues/2146这是一个Windows问题.芹菜--pool=solo选项解决了这个问题.

  • Mac也遇到这个问题了,感谢指点 (2认同)

小智 7

不要选择Celery --pool=solo选项,而是尝试-P threads在 Windows 上。


小智 5

设置CELERY_TASK_TRACK_STARTED = True(或在单个任务上 track_started=True)也有帮助 - 这将启用 STARTED 状态。