【发布时间】:2019-10-27 16:30:17
【问题描述】:
我想编写并运行一个有向无环图 (DAG),其中包含多个串行或并行运行的任务。理想情况下,它看起来像:
def task1():
# ...
def task2():
# ...
graph = Sequence([
task1,
task2,
Parallel([
task3,
task4
]),
task5
]
graph.run()
它将运行 1 -> 2 ->(3 和 4 同时运行)-> 5. 任务需要访问全局范围来存储结果、写入日志和访问命令行参数。
我的用例是编写部署脚本。 并行任务受 IO 限制:通常在远程服务器上等待完成一个步骤。
我研究了 threading、asyncio、Airflow,但没有找到任何简单的库可以在没有一些样板代码的情况下遍历并控制图形的执行。有这样的东西吗?
【问题讨论】:
-
编写队列任务的
sequence和parallel函数可能相当简单。sequence基本上只是一个for循环,parallel只是将任务交给multiprocessing.Pool.map。 -
这些任务是受 IO 限制还是受 CPU 限制?如果是后者,您将需要深入多处理兔子洞,并可能下载该模块的替代版本。内置的
multiprocessing有严重的局限性。 -
IO 绑定(在远程服务器上等待完成部署步骤)
-
可能不会,考虑到用例,但您会拥有大量
Parallel对象(如运行时每秒数百个)吗?可同时运行的任务总数会超过一千个吗? -
这个问题的解决方案但是在java中:stackoverflow.com/q/63354899/1925388
标签: python concurrency directed-acyclic-graphs