最近发现了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]
非常感谢能够解决问题的任何人!