Celery任务消失 - Django/Celery

3

这是我的代码:

我的任务

from celery.decorators import task

@task()
def add(x, y):
    return x + y

使用我的任务

from core.tasks import add

results = []

for i in range(100):
    results.append(add.delay(i, i))

问题 1

在几秒钟后,我执行以下操作:

for result in results:
    print result.result

打印出这个:

(这些值并不按照看起来像是一个模式返回)

None
None
None
None
8
None
None
None
None
18
None
None
None
None
28
None
None
None
None
38
...

第二次干净的操作系统安装和设置:

一切都按预期工作,仍然不确定发生了什么...


Django管理界面中的任务也会随机消失...


有人知道发生了什么吗?:|

1个回答

4

task.delay() 是异步的。顺带一提,整个AMQP的东西都是为了使任务变成异步的。如果你想要同步行为,那么使用celery还有什么意义呢?

from celery.decorators import task

@task()
def add(x, y, results):
    results.append(x + y)

------------8<-------------
from core.tasks import add

results = []

for i in range(100):
    add.delay(i, i, results)

在打印之前等待几秒钟(让消费者完成它们的工作),并且要注意结果可能会无序出现。

方法task.delay将返回一个celery.result.AsyncResult实例。在使用AsyncResult.result之前,您应该检查AsyncResult.state == SUCCESS。

最终的打印循环可能是:

for result in results:
    while not result.state.ready():
        time.sleep(secs)
    if result.state == u'SUCCESS':
        print result.result
    else:
        print "Something Rotten in the State of Denmark..."

这几乎和以下代码相同:

for result in results:
    print result.get()

看看TaskSets,它们比将结果存储在列表中更好。
实际上,人们会将结果存储在数据库中,并在客户端中放置等待循环,然后每隔几秒钟通过AJAX向服务器发送请求,直到完成。

1
@Paulo:感谢您的回复!我想说的是,这些任务仍然处于“PENDING”状态,从未变为“SUCCESS”状态……而且这些任务之间似乎存在某种模式。我同意您在回复中提出的所有观点,但我仍然无法让这些任务返回一个值。 - RadiantHex
@Paulo:顺带问一下,你觉得为什么一些任务无法被CAM捕获呢?是因为它们执行得太快而无法被捕捉到吗? - RadiantHex
@RadiantHex:假设您的task.ignore_result == False,当您使用result.get()而不是result.result时会发生什么? - Paulo Scardine
1
@RadiantHex:没有看到你的结果很难说。顺便问一下,你头像里的美女是谁? - Paulo Scardine
@Paulo:天哪!新的设置一切都完美运行了……旧的设置也非常新。 :| - RadiantHex
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接