用Python實現多核心並行計算

日常寫的程序,不管是單線程仍是多線程,大多隻有一個進程,並且只能在一個核內心工做。因此不少應用程序即便正在滿載運行,在任務管理器中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

相關文章
相關標籤/搜索