日常寫的程序,不管是單線程仍是多線程,大多隻有一個進程,並且只能在一個核內心工做。因此不少應用程序即便正在滿載運行,在任務管理器中CPU使用量仍是隻有50%(雙核CPU)或25%(四核CPU)html
若是能讓一個程序本身創建出多個進程,而且讓它們並行運行,那麼就能夠在不一樣cpu核心上同時運行,進而實現並行計算啦。python
Python的並行計算就是這麼作的。多線程
以前的理解錯了......仍是要學習一個app
一、多線程與多進程async
以前OS課學過.....函數
in general,線程是比進程低一級的調度單位。一個進程能夠包含多個進程。性能
線程之間的切換相對於進程之間更爲方便,代價也更低。因此講道理多線程的效率比多進程是要高的。學習
Linux自從2.6內核開始,就會把不一樣的線程交給不一樣的核心去處理。Windows也從NT.4.0開始支持這一特性。spa
【ref:http://blog.csdn.net/delacroix_xu/article/details/5928121.net
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