Celery-运行一组具有复杂依赖关系的任务



在我正在开发的应用程序中,用户可以执行由"步骤"组成的"转换"。一个步骤可以对其他步骤具有任意数量的依赖关系。我希望能够调用一个转换,并将这些步骤作为单独的Celery任务并行执行。

理想情况下,我想要类似芹菜任务树的东西,除了一般的有向无环图,而不仅仅是树,但似乎还不存在这样的库。

想到的第一个解决方案是对标准拓扑排序的并行自适应-我们不是确定满足依赖关系的步骤的线性排序,而是确定可以在开始时并行执行的整个步骤集,然后是可以在第二轮中执行的整个步骤集,依此类推

然而,当任务需要可变的时间,并且工作人员不得不空闲等待更长的运行任务,而现在有任务可以运行时,这并不是最佳的。(对于我的特定应用程序,这个解决方案目前可能还可以,但我仍然想弄清楚如何优化它。)

如中所述https://cs.stackexchange.com/questions/2524/getting-parallel-items-in-dependency-resolution,一种更好的方法是直接在DAG之外操作-在每个任务完成后,检查其任何依赖任务现在是否能够运行,如果可以,则运行它们。

实现这样的东西的最佳方式是什么?我不清楚是否有一种简单的方法可以做到这一点。

据我所知,Celery的组/链/和弦基元不够灵活,无法让我表达完整的DAG——尽管我可能错了?

我想我可以为任务创建一个包装器,在当前任务完成后通知依赖任务——不过我不确定处理这种通知的最佳方式是什么。访问应用程序的Django数据库并不是特别整洁,而且很难将其分解为通用库,但Celery本身并没有提供明显的机制。

我也遇到了这个问题,但除了一个库之外,我真的找不到更好的解决方案或库。对于任何仍然感兴趣的人,你可以签出https://github.com/selinon/selinon.虽然它只适用于python3,但它似乎是唯一一个完全符合您要求的东西。

气流是另一种选择,但气流与其他dag库一样,用于更静态的环境中。

最新更新