Python中类似GNU Make的并行任务依赖处理

5 投票
5 回答
1398 浏览
提问于 2025-04-16 12:23

我在寻找一种方法,或者说是一种思路,想在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 个回答

0

你可以看看 Scons。它是用Python写的,可以替代GNU Make。

SCons是一个软件构建工具,也就是说,它是一个比我们熟悉的经典“Make”构建工具更强大的选择。

SCons是通过Python脚本和一系列模块来实现的,而SCons的“配置文件”实际上是作为Python脚本来执行的。这让SCons拥有很多其他软件构建工具没有的强大功能。

1

你可以看看 Waf,它比Scons简单多了。

Waf是一个基于Python的框架,用来配置、编译和安装应用程序。以下是Waf的一些重要特点:

自动构建顺序:构建的顺序是根据输入和输出文件等信息自动计算出来的。

自动依赖关系:通过对文件和命令进行哈希处理,自动检测需要执行的任务。

性能:任务会自动并行执行,这样可以提高效率。

灵活性:可以通过子类化轻松添加新命令。

功能:默认支持多种编程语言和编译器。

文档:这个应用程序基于一个强大的模型,并在《Waf书》和API文档中有详细说明。

Python支持:支持从Python 2.4到3.2的版本(Jython 2.5和PyPy也被支持)。

(来自网站)

3

你可以看看jug。这是一个基于任务的并行处理框架,它可以帮助你管理任务之间的依赖关系。

撰写回答