python MultiProcessing模塊進程間通信的解惑與回顧


這段時間沉迷MultiProcessing模塊不能自拔,沒辦法,python的基礎不太熟,因此就是在不斷地遇到問題解決問題。之前學習asyncio模塊學的一知半解,后來想起MultiProcessing模塊更是一知半解,趁着暑假無聊就研究了一下,不得不說,這加深了自己對Python基礎的掌握與理解...於是就有了這一系列《python標准庫之MultiProcessing庫的研究 (1)》《python MultiProcessing標准庫使用Queue通信的注意要點》《python標准庫之MultiProcessing庫的研究 (2)》,今天算是最后做個總結吧,以及解惑,隨后你就知道解啥惑了。

我沒有詳細的講解MultiProcessing這個包的源代碼,沒有講解Pool底層機制,只有一個原因,我火候不夠,若是現在強行理解,對我沒多大好處,所以我選擇順其自然,先把最基本的用法掌握,實在不懂得看看源碼,大概過一遍源碼,對其實現機制有個大概的了解。MultiProcessing源代碼包我大概就認真看了兩個Pool.py以及managers.py,MultiProcessing的queues.py大概看了一下,最后總結的就是:不要覺得那些什么包,框架,模塊高大上,多方便,其實認真閱讀源碼你就會發現,那其實就是某個基礎扎實亦或是一群基礎扎實的大牛寫就得。換句話說,那些高大上的框架就是基礎的東西組成的。有人說,你說的這么輕松,你寫個試試。對不起,我寫不了,我說這些不是我裝逼怎么樣,只是闡述事實,而且並沒有貶低那些框架的意思,只是想降低你對這些框架的"敬畏"之心,不過話說回來,我覺着自己也能寫就框架,只是現在還不是時候,基礎不扎實。一個框架的寫成,需要作者知識的深度與廣度!可惜,我資歷不夠,慢慢來吧,我相信自己也會有那么一天...

總結的差不多了,具體的代碼你可以看看上面提到的幾篇文章

下面就是解惑了:為什么使用MultiProcessing的Process創建的進程就能夠時候用MultiProcessing的Queue來實現進程間通信,而使用Pool進程池創建的進程卻不行?而且為什么要使用MultiProcessing的Queue而不使用標准庫的Queue。

我在之前的一篇文章說過,標准庫的Queue只能實現線程間的通信,其get,put方法是阻塞的,而且除了這兩個方法之外的其他方法是不安全的,不能保證在多線程通信時,能夠穩定的訪問變量,對變量進行處理...

Queue.Queue是進程內非阻塞隊列,multiprocess.Queue是跨進程通信隊列。多進程前者是各自私有,后者是各子進程共有。
from Queue import Queue這個是普通的隊列模式,類似於普通列表,先進先出模式,get方法會阻塞請求,直到有數據get出來為止
from multiprocessing.Queue import Queue這個是多進程並發的Queue隊列,用於解決多進程間的通信問題。普通Queue實現不了。例如來跑多進程對一批IP列表進行運算,運算后的結果都存到Queue隊列里面,這個就必須使用multiprocessing提供的Queue來實現

線程是屬於進程的,線程運行在進程空間內,同一進程所產生的線程共享同一內存空間,當進程退出時該進程所產生的線程都會被強制退出並清除。線程可與屬於同一進程的其他線程共享進程所擁有的全部資源,但是其本身基本上不擁有系統資源,當然,擁有其在運行中必不可少的資源...進程間能不共享資源就不要共享...

so,解釋的差不多了吧...

下面看看 官網 的對Manager的介紹:
Managers provide a way to create data which can be shared between different processes, including sharing over a network between processes running on different machines. A manager object controls a server process which manages shared objects. Other processes can access the shared objects by using proxies.

我看了下Manager的源代碼,它使用了代理以及socket中的recv()等方法(好像是socket里面的)來實現跨進程通信以及代理通信

在這里要理清一個思緒:
MultiProcessing.Process創建的進程是有共同父進程的,而MultiProcess.Pool創建的進程則不是。進程池的存在就是為了減少進程的創建與銷毀的開銷。在這里我有個疑問了:創建一個子進程與創建一個進程有何區別?其開銷應該不一樣吧。
python實現多進程間通信的方式有很多種,例如隊列,管道等.
但是這些方式只適用於多個進程都是源於同一個父進程的情況
如果多個進程不是源於同一個父進程,只能用共享內存,信號量等方式,但是這些方式對於復雜的數據結構,例如Queue,dict,list等,使用起來比較麻煩,不夠靈活。
Manager是一種較為高級的多進程通信方式,它支持Python支持的任何數據結構....

因此,我們能夠使用MultiProcessing的Queue通信,但是如果使用的是進程池創建的進程,那么就得使用Manager類封裝的數據結構了...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM