python並發編程中的多進程(代碼實現)

來源:互聯網
上載者:User

標籤:資料   star   def   預設值   nic   圖片   name   指定   自訂   

一、multipricessing模組的介紹

     python中的多線程無法利用多核優勢,如果想要充分的使用多核CPU資源,在python中大部分情況下需要用多線程,python提供了multiprocessing模組

     multiprocessing模組用來開啟子進程,並在子進程中執行我們的任務(比如函數),該模組與多線程模組threading類的編程介面類似。

  multiprocessing模組的功能眾多:支援子進程、通訊和共用資料,執行不同形式的同步,提供了Process類,Queue類,Pipe類,Lock類等組件

二、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是否還在運行,在運行返回Truep.join()     如果加上此方法,那麼主線程將等著此線程運行完畢之後才會運行

屬性介紹:

p.daemon 預設值為False,如果設定為True,則代表後台啟動並執行守護進程,當p的父進程終止時,p也會隨之終止p.name 進程名p.pid 進程的pid

 

三、守護進程
主進程建立守護進程  其一:守護進程會在主進程代碼執行結束後就終止  其二:守護進程內無法再開啟子進程,否則拋出異常:AssertionError: daemonic processes are not allowed to have children注意:進程之間是互相獨立的,主進程代碼運行結束,守護進程隨即終止設定守護進程的方法:p.daemon = Truep.daemon 預設值為False,如果設定為True,則代表後台啟動並執行守護進程,當p的父進程終止時,p也會隨之終止

 

五、進程同步(鎖)

進程之間資料不共用,但是共用同一套檔案系統,所以訪問同一個檔案,或同一個列印終端,是沒有問題的,

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

加鎖方式:

1、匯入Lock類

2、執行個體化一個鎖   lock = Lock()

3、將lock作為參數傳給子進程函數

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

六、隊列

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

from multiprocessing import Queueq = Queue(3)  #限制最多放3個  如果超過3個則會堵塞,需要等待拿出去1個之後才能繼續放q.put(1)      #放資料(可以放任何資料類型)q.put(2)      #放資料(可以放任何資料類型)q.put(3)      #放資料(可以放任何資料類型)print(q.get()) #拿資料print(q.get()) #拿資料print(q.get()) #拿資料

python並發編程中的多進程(代碼實現)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.