AsyncResult get()不返回

时间:2014-11-12 04:37:33

标签: python celery

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

@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上运行。我正在添加并接受答案。我用一点来奖励每一种贡献。

3 个答案:

答案 0 :(得分:1)

你的chord没有受到攻击,因为它没有收到标题的结果,因此无法启动回调函数。

这是由于你的芹菜配置

CELERY_RESULT_BACKEND = 'amqp://'

但它应该是

CELERY_RESULT_BACKEND = 'amqp'

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

答案 1 :(得分:1)

你真的应该使用像redis或SQL这样的结果后端。 Celery documentation注释:

  

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

这应该可以很好地进行快速测试:

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

答案 2 :(得分:1)

在尝试了所有内容后,我决定完全尝试另一个系统,然后继续Huey。 Huey仍然以同样的方式失败,因此问题实际上与 Celery 本身无关。

Huey 在结构上更简单,我能够挖掘并且我意识到问题正在影响Redis的 TCP连接。我的一位同事告诉我,如果您在 Microsoft Azure (这是我的情况)上托管服务,就会发生这种情况。

解决方案包括为redis连接定义 TCP keepalive 低于5分钟。

我在 Huey 上应用了这个技巧,它只是将一些额外的参数传递给构造函数。然后我意识到 Huey 已经足够好了,所以我从来没有修复过 Celery 版本。如果有人希望通过解释如何在 Celery 上设置保持活动来改进此问题,他或她将获得接受奖励。