平常写的程序,无论是单线程还是多线程,大多只有一个进程,而且只能在一个核心里工作。所以很多应用程序即使正在满载运行,在任务管理器中CPU使用量还是只有50%(双核CPU)或25%(四核CPU)
如果能让一个程序自己建立出多个进程,并且让它们并行运行,那么就可以在不同cpu核心上同时运行,进而实现并行计算啦。
Python的并行计算就是这么做的。
这里来看第一个sample:
1 #main.py 2 import multiprocessing 3 import time 4 import numpy as np 5 from func import writeln 6 from calc import calc 7 import scipy.io as sio 8 9 def func1(x): 10 calc() 11 c1=0 12 d1=np.zeros(233,int) 13 for i in xrange(5): 14 d1[c1]=writeln(1,i) 15 c1+=1 16 #time.sleep(1) 17 sio.savemat(‘11.mat‘,{‘dd‘:d1}) 18 19 def func2(x): 20 calc() 21 c2=0 22 d2=np.zeros(233,int) 23 for i in xrange(5): 24 d2[c2]=writeln(2,i) 25 c2+=1 26 #time.sleep(1) 27 sio.savemat(‘22.mat‘,{‘dd‘:d2}) 28 29 def func3(x): 30 calc() 31 c3=0 32 d3=np.zeros(233,int) 33 for i in xrange(5): 34 d3[c3]=writeln(3,i) 35 c3+=1 36 #time.sleep(1) 37 sio.savemat(‘33.mat‘,{‘dd‘:d3}) 38 39 def func4(x): 40 calc() 41 c4=0 42 d4=np.zeros(233,int) 43 for i in xrange(5): 44 d4[c4]=writeln(4,i) 45 c4+=1 46 #time.sleep(1) 47 sio.savemat(‘44.mat‘,{‘dd‘:d4}) 48 49 if __name__ == "__main__": 50 pool = multiprocessing.Pool(processes=4) 51 52 pool.apply_async(func1, (1, )) 53 pool.apply_async(func2, (2, )) 54 pool.apply_async(func3, (3, )) 55 pool.apply_async(func4, (4, )) 56 57 pool.close() 58 pool.join() 59 60 61 print "Sub-process(es) done."
1 #func.py 2 def writeln(x,y): 3 aa=x*10+y 4 print(aa) 5 return(aa)
1 #calc.py 2 def calc(): 3 x=233 4 for i in xrange(1000000000): 5 x=x+1 6 x=x-1
main.py
Line 49 新建一个进程池,并指定本机cpu核心数量为4
这样主程序运行时就会建立出4个额外的进程,每个进程可以运行在不同核心上,从而实现了多核并行
Line 51--54 将func1--func4这四个函数都加到进程池中。
注意,如果我们加入了超过4个func,那么同时只会有四个在运行。剩下的要排队等待
calc.py
这是一个死循环....是为了演示cpu使用量...
运行效果:
单个calc()运行时,CPU占用量是25%
启用multiprocessor之后,一共开启了5个python.exe进程(一个主+4个子进程),cpu占用100%。同时风扇也开始狂转......
因为并行运行时具有顺序不确定性(参考OS课本上的多线程),用print输出结果可能会乱。这里我们都保存到mat文件里。
有了这种方法我就可以让我的训练数据集的程序也并行跑起来啦~特别爽
Reference:
http://www.coder4.com/archives/3352
http://www.cnblogs.com/kaituorensheng/p/4445418.html
http://rfyiamcool.blog.51cto.com/1030776/1357112
时间: 2024-10-10 02:24:07