动态创建的组的和弦未被称为

时间:2017-03-27 19:48:30

标签: python celery celery-task chord

最近发现了Celery的task.replace并试图利用它的力量我遇到了一个令人费解的情况,根据Celery的文档(以及各种Pull-Requests) / SO问题围绕互联网) - 应该工作。
我们说我有以下代码:

from celery import Celery, group
app = Celery(broker='pyamqp://', backend='redis://localhost:6379/0')

@app.task
def to_char(seq):
    return map(chr, seq)

@app.task
def flatten(seqs):
    final = list()
    for seq in seqs:
        final.extend(seq)
    return final

@app.task(bind=True)
def combine(self):
    sig = group([to_char.s([97]), to_char.s([98, 98])]) | flatten.s()
    raise self.replace(sig)

我显然简化了问题 - 但即使在这种简单的情况下,当我致电combine.delay().get()时,我希望收到[a, b, b]。 而不是得到结果,get()的呼叫无限期挂起并查看工作人员日志 - 我可以看到两个呼叫都被to_char收到&成功完成但未致电flatten

当我尝试单独执行它时(例如在Python控制台中)它会起作用并返回预期的结果,所以问题肯定在于我对task.replace的机制的理解:

g = group([to_char.s([97]), to_char.s([98, 98])])
c = g | flatten.s()
c.delay().get() # -> [a, b, b]

非常感谢能够解决问题的任何人!

0 个答案:

没有答案