
深入理解python多進程編程
1、python多進程編程背景
python中的多進程最大的好處就是充分利用多核cpu的資源,不像python中的多線程,受制于GIL的限制,從而只能進行cpu分配,在python的多進程中,適合于所有的場合,基本上能用多線程的,那么基本上就能用多進程。
在進行多進程編程的時候,其實和多線程差不多,在多線程的包threading中,存在一個線程類Thread,在其中有三種方法來創(chuàng)建一個線程,啟動線程,其實在多進程編程中,存在一個進程類Process,也可以使用那集中方法來使用;在多線程中,內存中的數(shù)據(jù)是可以直接共享的,例如list等,但是在多進程中,內存數(shù)據(jù)是不能共享的,從而需要用單獨的數(shù)據(jù)結構來處理共享的數(shù)據(jù);在多線程中,數(shù)據(jù)共享,要保證數(shù)據(jù)的正確性,從而必須要有所,但是在多進程中,鎖的考慮應該很少,因為進程是不共享內存信息的,進程之間的交互數(shù)據(jù)必須要通過特殊的數(shù)據(jù)結構,在多進程中,主要的內容如下圖:
2、多進程的類Process
多進程的類Process和多線程的類Thread差不多的方法,兩者的接口基本相同,具體看以下的代碼:
在上面例子中可以看到,多進程和多線程的API接口是一樣一樣的,顯示創(chuàng)建進程,然后進行start開始運行,然后join等待進程結束。
在需要執(zhí)行的函數(shù)中,打印出了進程的id和pid,從而可以看到父進程和子進程的id號,在linu中,進程主要是使用fork出來的,在創(chuàng)建進程的時候可以查詢到父進程和子進程的id號,而在多線程中是無法找到線程的id,執(zhí)行效果如下:
在操作系統(tǒng)中查詢的id的時候,最好用pstree,清晰:
├─sshd(1508)─┬─sshd(2259)───bash(2261)───python(7520)─┬─python(7521) │ │ ├─python(7522) │ │ ├─python(7523) │ │ ├─python(7524) │ │ ├─python(7525) │ │ ├─python(7526) │ │ ├─python(7527) │ │ ├─python(7528) │ │ ├─python(7529) │ │ ├─python(7530) │ │ ├─python(7531) │ │ └─python(7532)
在進行運行的時候,可以看到,如果沒有join語句,那么主進程是不會等待子進程結束的,是一直會執(zhí)行下去,然后再等待子進程的執(zhí)行。
在多進程的時候,說,我怎么得到多進程的返回值呢?然后寫了下面的代碼:
嘗試從結果中返回值,從而在主進程中得到子進程的返回值,然而,,,并沒有結果,后來一想,在進程中,進程之間是不共享內存的 ,那么使用list來存放數(shù)據(jù)顯然是不可行的,進程之間的交互必須依賴于特殊的數(shù)據(jù)結構,從而以上的代碼僅僅是執(zhí)行進程,不能得到進程的返回值,但是以上代碼修改為線程,那么是可以得到返回值的。
3、進程間的交互Queue
進程間交互的時候,首先就可以使用在多線程里面一樣的Queue結構,但是在多進程中,必須使用multiprocessing里的Queue,代碼如下:
其實這個是上面例子的改進,在其中,并沒有使用什么其他的代碼,主要就是使用Queue來保存數(shù)據(jù),從而可以達到進程間交換數(shù)據(jù)的目的。
在進行使用Queue的時候,其實用的是socket,感覺,因為在其中使用的還是發(fā)送send,然后是接收recv。
在進行數(shù)據(jù)交互的時候,其實是父進程和所有的子進程進行數(shù)據(jù)交互,所有的子進程之間基本是沒有交互的,除非,但是,也是可以的,例如,每個進程去Queue中取數(shù)據(jù),但是這個時候應該是要考慮鎖,不然可能會造成數(shù)據(jù)混亂。
4、 進程之間交互Pipe
在進程之間交互數(shù)據(jù)的時候還可以使用Pipe,代碼如下:
在以上代碼中,主要是使用Pipe中返回的兩個socket來進行傳輸和接收數(shù)據(jù),在父進程中,使用的是parent_conn,在子進程中使用的是child_conn,從而子進程發(fā)送數(shù)據(jù)的方法send,而在父進程中進行接收方法recv
最好的地方在于,明確的知道收發(fā)的次數(shù),但是如果某個出現(xiàn)異常,那么估計pipe不能使用了。
5、進程池pool
其實在使用多進程的時候,感覺使用pool是最方便的,在多線程中是不存在pool的。
在使用pool的時候,可以限制每次的進程數(shù),也就是剩余的進程是在排隊,而只有在設定的數(shù)量的進程在運行,在默認的情況下,進程是cpu的個數(shù),也就是根據(jù)multiprocessing.cpu_count()得出的結果。
在poo中,有兩個方法,一個是map一個是imap,其實這兩方法超級方便,在執(zhí)行結束之后,可以得到每個進程的返回結果,但是缺點就是每次的時候,只能有一個參數(shù),也就是在執(zhí)行的函數(shù)中,最多是只有一個參數(shù)的,否則,需要使用組合參數(shù)的方法,代碼如下所示:
在使用map的時候,直接返回的一個是一個list,從而這個list也就是函數(shù)執(zhí)行的結果,而在imap中,返回的是一個由結果組成的迭代器,如果需要使用多個參數(shù)的話,那么估計需要*args,從而使用參數(shù)args。
在使用apply.async的時候,可以直接使用多個參數(shù),如下所示:
在進行得到各個結果的時候,注意使用了一個list來進行append,要不然在得到結果get的時候會阻塞進程,從而將多進程編程了單進程,從而使用了一個list來存放相關的結果,在進行得到get數(shù)據(jù)的時候,可以設置超時時間,也就是get(timeout=5),這種設置。
總結:
在進行多進程編程的時候,注意進程之間的交互,在執(zhí)行函數(shù)之后,如何得到執(zhí)行函數(shù)的結果,可以使用特殊的數(shù)據(jù)結構,例如Queue或者Pipe或者其他,在使用pool的時候,可以直接得到結果,map和imap都是直接得到一個list和可迭代對象,而apply_async得到的結果需要用一個list裝起來,然后得到每個結果。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關鍵? 在循環(huán)神經網絡(RNN)家族中,長短期記憶網絡(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準備指南? ? 在數(shù)據(jù)驅動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計的實用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實施重大更新。 此次更新旨在確保認 ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務的價值轉化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預測分析中的應用:從數(shù)據(jù)查詢到趨勢預判? ? 在數(shù)據(jù)驅動決策的時代,預測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結束)并非工作的終點,而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報考到取證的全攻略? 在數(shù)字經濟蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準 ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領域中,準確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認證作為國內權威的數(shù)據(jù)分析能力認證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應對策略? 長短期記憶網絡(LSTM)作為循環(huán)神經網絡(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學方法在市場調研數(shù)據(jù)中的深度應用? 市場調研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學方法則是市場調研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉日期:解鎖數(shù)據(jù)處理的關鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準確性的基礎 ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03