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才能用,会有不少底层的问题,欢迎大家补充。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值