我喜欢在一个不可变任务的小工作流中组合一个链和一个组,并且没有结果后端。
然而,当我尝试这个Celery时,它会自动将其转换为和弦,然后抱怨没有结果后端。
有没有什么方法可以在没有结果后端的情况下让它发挥作用?
代码:
@shared_task
def test_canvas():
workflow = chain(group(test_task_a.si(), test_task_b.si()), test_task_c.si())
workflow.delay()
这是我得到的错误消息:
raised unexpected: NotImplementedError('Starting chords requires a result backend to be configured.
Note that a group chained with a task is also upgraded to be a chord, as this pattern requires synchronization.
Result backends that supports chords: Redis, Database, Memcached, and more.',)
有趣的是,单独运行一个链或一个组效果很好。
示例:
workflow = chain(test_task_a.si(), test_task_b.si(), test_task_c.si())
workflow.delay()
不幸的是,我认为答案是否定的-没有后端就无法运行chord:
和弦中使用的任务不得忽略其结果。在实践中,这意味着您必须启用result_backend才能使用和弦。
test_canvas
中的第一个示例是隐式chord
:和弦是指只有在一组中的所有任务都完成执行(链接(后才执行的任务。如果你想一想背后的逻辑(好吧,在这里解释一下(有人(后端(需要弄清楚所有并行任务(组(何时结束,才能知道何时应该触发下一个(链接的(任务。
在第二个示例中,与group
同时运行多个任务很简单(如果不采取任何操作,则以后无需协调(。chain
也是如此——每个任务都负责触发下一个任务,不需要复杂的协调。