我可以在没有结果后端的情况下将链和组合并吗?

时间:2019-11-18 14:20:32

标签: python celery

我喜欢在一个不可变任务的小型工作流中结合一个链和一组,并且没有结果后端。

但是,当我尝试使用此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()

1 个答案:

答案 0 :(得分:1)

不幸的是,我认为答案是否定的-如果没有backend,您将无法和弦:

  

和弦中使用的任务一定不能忽略其结果。实际上,这意味着您必须启用result_backend才能使用和弦。

您在test_canvas中的第一个示例隐式为chord: 和弦是仅在组中的所有任务完成执行(link)之后执行的任务。 如果您考虑背后的逻辑(请解释here)  某人(后端)需要弄清楚所有并行任务何时结束(该组),以知道何时应触发下一个(链接的)任务。

在第二个示例中,与group同时运行多个任务很简单(如果不采取任何措施,以后再也无法协调)。 与chain相同-每个任务都负责触发下一个任务,不需要复杂的协调。