了解PP模块
上一节中,我们介绍了直接使用系统调用创建进程间通讯的方法,这是一种很低层的机制. 并且它只在Linux或Unix环境下才有效. 接下来我们会使用一个名为PP的python模块来创建IPC通讯,这种通讯不仅仅可以在本地进程间进行,还能通过计算机网络在物理上彼此分散的进程间进程.
关于PP模块的文档并不多,可以在https://www.parallelpython.com/ 中找到相关文档和FAQ. API提供了大量的使用该工具的说明. 十分的简洁明了
使用PP模块的最大优势在于它提供了一个抽象层. PP模块的重要特征如下所示:
- 自动探测进程的数量并以此改进负载均衡
- 可以在运行期改变要投入的处理器数量
- 运行时负载均衡
- 全网自动发现资源
PP模块有两种方式来执行并行代码. 第一种方式基于SMP架构,即在同一台机器上有多个处理器/核心. 第二中方式将网络中的各个机器配置,整合成区块,并将任务分配給这些机器去运行. 无论哪一种方式,进程间消息交换的过程都是抽象的. 这使得我们无需关系其低层的实现方式到底是通过管道还是socket. 我们只需要使用回调函数来通过参数和函数的方式来交换信息就行了. 下面给个例子.
在PP的API中有一个名为Server的类,使用该类可以实现在本地和远程的进程间封装和分派任务. Server的构造函数(_init_)中有几个参数比较重要:
- ncpus: 该参数用于指定执行任务的工作进程数量. 若没有指定该参数,则会自动根据机器上处理器/核心的数量来创建工作进程的总数,以优化资源的使用。
-
ppservers: 该参数是一个元组,该元组的元素为并行Python执行服务器(Parallel Python Execution Servers - PPES)的名称或IP地址. 一个PPES由连入网络的机器组成. 且该机器通过
ppsever.py
共组运行并等待待执行的任务. 其他参数的说明请参阅http://www.parallelpython.com/content/view/15/30/Server
类的实例拥有很多方法,其中submit
方法允许我们分配任务到各个工作进程.submit
函数具有如下签名:submit(self, func, args=(), depfuncs=(), modules=(), callback=None, callbackargs=(), group='default', globals=None)
在submit
方法中,我们主要关注以下几个参数:
- func: 该函数会被本地进程或远程服务器执行。
- args: 该参数提供了了执行
func
函数时的参数。 - modules: 该参数说明远程代码(remote code)或进程为了调用func函数,需要导入哪些模块. 例如若被分配的函数用到了time模块, 则在元组参数中,传递方式必须为
modules=('time',)
- callback :这是执行完
func
函数后的回调函数,func
的执行结果会作为其函数参数. 常用于对func
的执行结果作进一步加工
还有其他的参数将会在下一节分析代码时进行介绍.
创建日期: 2023年3月1日