项目介绍
基于multiprocessing的通用的并行计算框架,用于计算密集型场景
github
https://github.com/conggova/mpparallizer.git
接口定义
class MPParallizer(object) :
@staticmethod
def parallize(paras , func , threads , para_serder = FakeSerDer , result_serder = FakeSerDer)
@staticmethod
def parallize_with_general_paras(paras , general_paras , func , threads , para_serder = FakeSerDer , general_paras_serder = FakeSerDer , result_serder = FakeSerDer)
parallize
对于一组参数paras ( 形如 [(para1 , para2 , …) , (para1 , para2 , …) , …] ) 和一个函数func( 必须是普通函数 , 调用形式为func(para1 , para2 , …) ),利用Python的Multiprocessing库做并行执行,得到一个结果列表。
para_serder和result_serder为对于每一组参数和结果的序列化工具类,实现SerDer接口(包括serialize和deserialize方法)。
默认的FakeSerDer也是SerDer的一种实现,即不做序列化和反序列化。
parallize_with_general_paras
带通用参数(general_paras)的并行化,如果在需要并行执行的一组参数中有某几个参数是相同的,我把它们称为通用参数,有时候把通用参数提出来能大大提高并行化的开销,尤其如果需要序列化和反序列化。
paras = [(para1 , para2 , …) , (para1 , para2 , …) , …]
general_paras = (general_para1 , general_para2 , …)
func 为函数,调用形式为(para1 , para2 , … , general_para1 , general_para2 , … )这种形式的输入
para_serder 是SerDer的实现 , 可以将一组para做序列化,并能对序列化的结果反序列化
general_paras_serder 是SerDer的实现 , 可以将general_paras做序列化,并能对序列化的结果反序列化
result_serder 是SerDer的实现 , 可以对func的返回结果做序列化和反序列化。
默认的FakeSerDer也是SerDer的一种实现,即不做序列化和反序列化。
SerDer的接口定义
class SerDer(object) :
@staticmethod
def serialize(para)
@staticmethod
def deserialize(para)
SerDer采用了pickle做序列化和反序列化
FakeSerDer不做序列化和反序列化
用例
from Parallizer.MPParallizer import MPParallizer
from Parallizer.FakeParallizer import FakeParallizer
from math import sqrt
def add(a , b) :
return a + b
if __name__ == "__main__" :
#注意,哪怕只有一个参数也要打包成一个元组
paras = [(i,) for i in range(0 , 10)]
print(paras)
res = MPParallizer.parallize(paras , sqrt , 20)
print(res)
res = MPParallizer.parallize_with_general_paras(paras , [100 ] , add , 20)
print(res)
输出
[(0,), (1,), (2,), (3,), (4,), (5,), (6,), (7,), (8,), (9,)]
[0.0, 1.0, 1.4142135623730951, 1.7320508075688772, 2.0, 2.23606797749979, 2.449489742783178, 2.6457513110645907, 2.8284271247461903, 3.0]
[100, 101, 102, 103, 104, 105, 106, 107, 108, 109]