Python multiprocess 使用指南
Multiprocess 的一些常用功能
先举个例子:
def transform(x,data):
xxxxxx
return output
import multiprocess
def main():
index_pointed=[]
temp_data=[]
data_all=[.......]
pool = multiprocessing.Pool(processes=m)
for x in range(0,len(data_all),int(len(data_all)/m)):
temp_data.append(pool.apply_async(transform,(x,data_all[x: min(len(data_all),x+int(len(data_all)/m))])))
pool.close()
pool.join()
data = temp_data[0].get()
for index in range(1, len(temp_data)):
data = np.append(data, temp_data[index].get(), axis=0)
这里面就是利用pool方法建一个进程池。然后调用apply_async去多进程运行同个function。然后再join把结果汇总。
7个坑(不理解过程会犯错)
1、这里用了apply_async,所以返回的是AsyncResult对象。要调用其get()方法来检索函数调用的结果。
2、也可以用apply,map的方法,结果就不用get了,但是要注意阻塞机制,直接换成apply就变成单进程的速度了。
3、python-c里有一个bug如果有进程喂的参数(例如data)超过255MB会导致无法准确的合并进程的结果,出现assert left>1之类的报错就要注意了。简单的方式可以增加进程数减少每个进程的数据量,反正CPU进程过多也会自动排队,把cpu用到100%即可。
4、 例子里故意写了个没用的参数x,要注意如果只有一个参数data_all[…]会自动当成有len(data_all[…])个argument然后就报错了,这里参数的格式必须是元组。
5、 所用的function必须是单输出,可以用list或者dict来整合你的output。
6、用multiprocess 来处理读取文件这种IO的活有时速度会提不上去(是应为受硬盘的读写速度瓶颈的影响),cpu再牛x也没用。
7、不要在for循环里加其他python语句,这点在for 循环里运行shell语句一样,为了要执行python语句又造成了阻塞,不能达成多线程的目的。
其他写并行计算的方法也有很多不止这一个,python毕竟还是要编译成C才能用,会有不少底层的问题,欢迎大家补充。