【Multiprocessing系列】Multiprocessing基礎

 multiprocessing是Python的標準模塊,它既可以用來編寫多進程,也可以用來編寫多線程。如果是多線程的話,用multiprocessing.dummy即可,用法與multiprocessing基本相同,這裡主要介紹多進程的用法,歡迎糾錯。

#### (一)Multiprocessing介紹

##### 為什麼要使用python多進程?

  因為python使用全局解釋器鎖(GIL),他會將進程中的線程序列化,也就是多核cpu實際上並不能達到並行提高速度的目的,而使用多進程則是不受限的,所以實際應用中都是推薦多進程的。

  如果每個子進程執行需要消耗的時間非常短(執行+1操作等),這不必使用多進程,因為進程的啟動關閉也會耗費資源。

  當然使用多進程往往是用來處理CPU密集型(科學計算)的需求,如果是IO密集型(文件讀取,爬蟲等)則可以使用多線程去處理。

##### multiprocessing常用組件及功能

創建管理進程模塊:

* [Process](【Multiprocessing系列】Process)(用於創建進程模塊)

* [Pool](【Multiprocessing系列】Pool)(用於創建管理進程池)

* Queue(用於進程通信,資源共享)

* Value,Array(用於進程通信,資源共享)

* Pipe(用於管道通信)

* Manager(用於資源共享)

同步子進程模塊:

* Condition

* Event

* Lock

* RLock

* Semaphore

#### (二)Multiprocessing進程管理模塊

說明:由於篇幅有限,模塊具體用法結束請參考每個模塊的具體鏈接。

##### Process模塊

Process模塊用來創建子進程,是Multiprocessing核心模塊,使用方式與Threading類似,可以實現多進程的創建,啟動,關閉等操作。

具體介紹請參考:[Process模塊介紹](【Multiprocessing系列】Process)

##### Pool模塊

Pool模塊是用來創建管理進程池的,當子進程非常多且需要控制子進程數量時可以使用此模塊。

具體介紹請參考:[Pool模塊介紹](【Multiprocessing系列】Pool)

##### Queue模塊

Queue模塊用來控制進程安全,與線程中的Queue用法一樣。

##### Pipe模塊

Pipe模塊用來管道操作。

##### Manager模塊

Manager模塊常與Pool模塊一起使用,作用是共享資源。

#### (三)Multiprocessing同步進程模塊

##### Lock模塊

作用:當多個進程需要訪問共享資源的時候,Lock可以用來避免訪問的衝突。

具體場景:所有的任務在列印的時候都會向同一個標準輸出(stdout)輸出。這樣輸出的字元會混合在一起,無法閱讀。使用Lock同步,在一個任務輸出完成之後,再允許另一個任務輸出,可以避免多個任務同時向終端輸出。

代碼實現:

from multiprocessing import Process, Lock nndef l(lock, num): n lock.acquire() n print "Hello Num: %s" % (num) n lock.release() nnif __name__ == __main__: n lock = Lock() #這個一定要定義為全局n for num in range(20): n Process(target=l, args=(lock, num)).start() #這個類似多線程中的threading,但是進程太多了,控制不了。n

##### Semaphore模塊

作用:用來控制對共享資源的訪問數量,例如池的最大連接數。

##### Event模塊

作用:用來實現進程間同步通信。

#### (四)Multiprocessing.dummy多線程

Multiprocessing.dummy用法與Multiprocessing用法基本相同,只不過是用來創建多線程。

#### (五)使用Multiprocessing疑問

* *啟動多進程的代碼一定要放在 *if __name__=="__main__":* 後面嗎?*

  解答:windows系統下,想要啟動一個子進程,必須加上*if __name__=="__main__":*,linux則不需要。

* *父進程中的全局變數能被子進程共享嗎?*

  解答:不行,因為每個進程享有獨立的內存數據,如果想要共享資源,可以使用Manage類,或者Queue等模塊。

* *子進程能結束其他子進程或父進程嗎?如果能,怎麼通過子進程去結束所有進程?*

  解答:此需求可以稍作修改:所有的子進程都是為了完成一件事情,而當某個子進程完成該事情後,父進程就該結束所有子進程,請問該怎麼做?此時結束所有子進程的操作可以交給父進程去做,因為子進程想要結束另外的子進程比較難實現。

  那麼問題就又變成了父進程什麼時候該結束所有進程?

  其中一個思路是*獲取每個子進程的返回值*,一旦有返回True(結束的標記),則立馬結束所有進程;

  另外一種思路是*使用共享資源*,父進程可以一直去判斷這個公共資源,一旦子進程將它改變,則結束所有子進程。(推薦使用前者,因為多進程中不推薦使用資源共享)

* *子進程中還能再創建子進程嗎?*

解答:可以,子進程可以再創建進程,線程中也可以創建進程。

#### (六)多進程資源共享問題

多進程中不推薦使用資源共享,如果非要使用,可以參考以下鏈接。

具體介紹請參考:[多進程資源共享問題](【Multiprocessing系列】共享資源)

#### (七)獲取子進程返回值問題

多進程中往往會碰到獲取子進程返回值的問題,如果遇到問題可以參考以下鏈接。

具體介紹請參考:[獲取子進程返回值問題](【Multiprocessing系列】子進程返回值)

#### 傳送門

【Multiprocessing系列】共享資源

【Multiprocessing系列】子進程返回值

【Multiprocessing系列】Pool

【Multiprocessing系列】Process

【Multiprocessing系列】Multiprocessing基礎

推薦閱讀:

0x1: 埠掃描
Python入門到精通視頻課程(7)

TAG:Python | Python教程 |