AsyncResult get() does not return



我正在尝试使用芹菜和弦,并尝试运行以下示例-

@celery.task(ignore_result = False)
def add(x, y):
    return x + y
@celery.task(ignore_result = False)
def tsum(numbers):
    return sum(numbers)
from celery import chord
callback = tsum.s()
header = [add.s(i, i) for i in range(5)]
result = chord(header)(callback)
print result.get()

我可以看到所有的任务都在芹菜日志中运行。但是,线路result.get()不返回。我已经设置了CELERY_RESULT_BACKEND = 'amqp://'

我对芹菜和弦非常陌生,并试图首先运行这个示例程序。我是不是错过了什么。

以下是我的芹菜配置-

CELERY_BROKER_URL = 'amqp://'
CELERY_RESULT_BACKEND = 'amqp://'
CELERY_TASK_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ENABLE_UTC = True

编辑:添加决定性的细节!

问题已经解决,但与芹菜本身完全无关。详细信息是该系统在Microsoft Azure上运行。我正在添加并接受答案。我对每一种贡献都给予一分奖励。

您的chord没有被击中,因为它没有从标头接收结果,因此无法启动回调函数。

这是由于你的芹菜配置

CELERY_RESULT_BACKEND = 'amqp://'

但应该是

CELERY_RESULT_BACKEND = 'amqp'

改变它,它应该可以正常工作。

您确实应该使用redis或SQL之类的东西作为结果后端。Celery文档注释:

RabbitMQ结果后端(amqp)很特别,因为它实际上并没有存储状态,而是将它们作为消息发送。这是一个重要的区别,因为这意味着只能检索结果一旦如果有两个进程在等待相同的结果进程永远不会收到结果!

这对于快速测试来说应该很好:

CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite'

在尝试了所有东西之后,我决定完全尝试另一个系统,于是我选择了Huey。Huey仍然以同样的方式失败,因此问题实际上与芹菜本身无关。

由于Huey在结构上要简单得多,我能够深入研究,并意识到这个问题正在影响Redis的TCP连接。我的一个同事告诉我,如果你在Microsoft Azure上托管服务,就会发生这种情况(我就是这样)。

该解决方案包括为redis连接定义一个TCP保持活动时间小于5分钟

我在Huey上应用了这个技巧,它只是向构造函数传递一些额外的参数。然后我意识到Huey已经足够好了,所以我从未修复Celery版本。如果有人想通过解释如何在芹菜上设置保活来改进这个问题,他或她将获得认可。

相关内容

  • 没有找到相关文章