python併發編程之多進程(實現)

1、multipricessing模塊的介紹

     python中的多線程沒法利用多核優點,若是想要充分的使用多核CPU資源,在python中大部分狀況下須要用多線程,python提供了multiprocessing模塊python

     multiprocessing模塊用來開啓子進程,並在子進程中執行咱們的任務(好比函數),該模塊與多線程模塊threading類的編程接口相似。編程

  multiprocessing模塊的功能衆多:支持子進程、通訊和共享數據,執行不一樣形式的同步,提供了Process類,Queue類,Pipe類,Lock類等組件windows

2、Process模塊的介紹

基本格式:

1 from multiprocessing import Process         #導入模塊
2 
3 def func(x):                                #定義一個函數(等待開一個新線程執行的函數)
4     print(x) 5 
6 if __name__ == '__main__':                  #windows下必定要加上這句話才能運行
7     p = Process(target=func,args=('傳參',)) #實例化一個進程,將函數名做爲參數傳遞,將須要傳給函數的參數(元組形式)傳遞
8     p.start()                               #(通知操做系統)開啓此進程

經過類的方式調用:

from multiprocessing import Process     #調用模塊

class MyProcess(Process):               #定義一個類,必需要繼承Process類
    def __init__(self,name):            #若是須要參數,必定要有init方法
        super().__init__()              #若是有init方法,必定要調用父類的init方法
        self.name = name def run(self):                      #必定要實現一個run方法來重寫父類的run
        print('子進程%s已開啓'%self.name) if __name__ == '__main__': p = MyProcess('aaa')                #實例化一個自定義類的對象
    p.start()                           #開啓進行

參數介紹:

target表示調用對象,既子進程要執行的任務 args表示調用對象的位置參數元組,如:args=(1,)或者args=(1,2) kwargs表示調用對象的字典,如:kwargs={'name':'fuyong'}

方法介紹:

p.start() 啓動進程,而且調用該子進程的run()方法 p.run() 進程啓動時運行的方法,正式它去調用target指定的函數,咱們自定義類的話必定要實現該方法 P.terminate()強制終止程序p,不會進行任何清理操做,若是p建立了子進程,那麼該子進程就成了‘殭屍進程 使用此方法時要特別當心,若是p還保留了一個鎖,那麼鎖也不會被釋放,進而致使了死鎖 p.is_alive() 判斷p是否還在運行,在運行返回True p.join() 若是加上此方法,那麼主線程將等着此線程運行完畢以後纔會運行

屬性介紹:

p.daemon 默認值爲False,若是設置爲True,則表明後臺運行的守護進程,當p的父進程終止時,p也會隨之終止 p.name 進程名 p.pid 進程的pid

 

3、守護進程

主進程建立守護進程   其一:守護進程會在主進程代碼執行結束後就終止   其二:守護進程內沒法再開啓子進程,不然拋出異常:AssertionError: daemonic processes are not allowed to have children 注意:進程之間是互相獨立的,主進程代碼運行結束,守護進程隨即終止 設置守護進程的方法: p.daemon = True p.daemon 默認值爲False,若是設置爲True,則表明後臺運行的守護進程,當p的父進程終止時,p也會隨之終止

 

4、進程同步(鎖)

進程之間數據不共享,可是共享同一套文件系統,因此訪問同一個文件,或同一個打印終端,是沒有問題的,多線程

而共享帶來的是競爭,競爭帶來的結果就是錯亂,如何控制,就是加鎖處理函數

加鎖方式:ui

一、導入Lock類spa

二、實例化一個鎖   lock = Lock()操作系統

三、將lock做爲參數傳給子進程函數線程

四、函數在須要枷鎖的代碼前加上lock.acquire()方法,在須要釋放鎖的地方加上lock.release()方法code

5、隊列

   進程彼此之間互相隔離,要實現進程間通訊(IPC),multiprocessing模塊支持兩種形式:隊列和管道,這兩種方式都是使用消息傳遞的

from multiprocessing import Queue q = Queue(3)  #限制最多放3個 若是超過3個則會堵塞,須要等待拿出去1個以後才能繼續放
 q.put(1)      #放數據(能夠聽任何數據類型)
q.put(2)      #放數據(能夠聽任何數據類型)
q.put(3)      #放數據(能夠聽任何數據類型)

print(q.get()) #拿數據
print(q.get()) #拿數據
print(q.get()) #拿數據
相關文章
相關標籤/搜索