平常寫的程序,無論是單線程還是多線程,大多只有一個進程,而且只能在一個核心里工作。所以很多應用程序即使正在滿載運行,在任務管理器中CPU使用量還是只有50%(雙核CPU)或25%(四核CPU)
如果能讓一個程序自己建立出多個進程,並且讓它們並行運行,那么就可以在不同cpu核心上同時運行,進而實現並行計算啦。
Python的並行計算就是這么做的。
之前的理解錯了......還是要學習一個
1、多線程與多進程
之前OS課學過.....
in general,線程是比進程低一級的調度單位。一個進程可以包含多個進程。
線程之間的切換相對於進程之間更為方便,代價也更低。所以講道理多線程的效率比多進程是要高的。
Linux自從2.6內核開始,就會把不同的線程交給不同的核心去處理。Windows也從NT.4.0開始支持這一特性。
【ref:http://blog.csdn.net/delacroix_xu/article/details/5928121
2.多線程與Python
好多語言都可以很好的資詞多線程。然而Python是個例外......
對於IO密集型的任務,使用多線程還是能提高一下CPU使用率。對於CPU密集型的任務,Python中的多線程其實是個雞肋......沒卵用......
在Python的解釋器CPython中存在一個互斥鎖。簡單來講就是同一時間只能有一個線程在執行,其它線程都處於block模式。
【ref:https://www.zhihu.com/question/22191088
3.多進程
要想在py中充分利用多核cpu,就只能用多進程了。
雖然代價高了些,但是比起並行計算帶來的性能提升這些也微不足道了。最重要的是好!寫!啊!
這里來看第一個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