Python中类似GNU Make的并行任务依赖处理
我在寻找一种方法,或者说是一种思路,想在Python中实现类似GNU Make的功能。目前,我们使用makefile来执行处理,因为makefile在并行运行方面非常出色,只需更改一个选项:-j x。此外,GNU Make已经内置了依赖关系的管理,所以如果想增加一个处理器或者处理更多线程,只需要更新那个选项。我希望在Python中也能拥有同样的强大和灵活性,但我还没有找到合适的办法。
举个例子:
all: dependency_a dependency_b dependency_c
dependency_a: dependency_d
stuff
dependency_b: dependency_d
stuff
dependency_c: dependency_e
stuff
dependency_d: dependency_f
stuff
dependency_e:
stuff
dependency_f:
stuff
如果我们进行标准的单线程操作(-j 1),操作的顺序可能是:
dependency_f -> dependency_d -> dependency_a -> dependency_b -> dependency_e \
-> dependency_c
对于两个线程(-j 2),我们可能会看到:
1: dependency_f -> dependency_d -> dependency_a -> dependency_b
2: dependency_e -> dependency_c
有没有人有建议,推荐一个已经构建好的包或者一种方法?我完全开放,只要是符合Python风格的解决方案或方法就好。
提前谢谢大家!
5 个回答
你可以看看 Scons。它是用Python写的,可以替代GNU Make。
SCons是一个软件构建工具,也就是说,它是一个比我们熟悉的经典“Make”构建工具更强大的选择。
SCons是通过Python脚本和一系列模块来实现的,而SCons的“配置文件”实际上是作为Python脚本来执行的。这让SCons拥有很多其他软件构建工具没有的强大功能。
你可以看看 Waf,它比Scons简单多了。
Waf是一个基于Python的框架,用来配置、编译和安装应用程序。以下是Waf的一些重要特点:
自动构建顺序:构建的顺序是根据输入和输出文件等信息自动计算出来的。
自动依赖关系:通过对文件和命令进行哈希处理,自动检测需要执行的任务。
性能:任务会自动并行执行,这样可以提高效率。
灵活性:可以通过子类化轻松添加新命令。
功能:默认支持多种编程语言和编译器。
文档:这个应用程序基于一个强大的模型,并在《Waf书》和API文档中有详细说明。
Python支持:支持从Python 2.4到3.2的版本(Jython 2.5和PyPy也被支持)。
(来自网站)
你可以看看jug。这是一个基于任务的并行处理框架,它可以帮助你管理任务之间的依赖关系。