版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Python多進程并行編程實踐:以multiprocessing模塊為例專欄?Pytlab,Python中文社區(qū)專欄作者。主要從事科學計算與高性能計算領域的應用,主要語言為Python,C,C++。熟悉數值算法(最優(yōu)化方法,蒙特卡洛算法等)與并行化算法(MPI,OpenMP等多線程以及多進程并行化)以及python優(yōu)化方法,經常使用C++給python寫擴展。blog:github:/PytLab?—前言并行計算是使用并行計算機來減少單個計算問題所需要的時間,我們可以通過利用編程語言顯式的說明計算中的不同部分如何再不同的處理器上同時執(zhí)行來設計我們的并行程序,最終達到大幅度提升程序效率的目的。眾所周知,Python中的GIL限制了Python多線程并行對多核CPU的利用,但是我們仍然可以通過各種其他的方式來讓Python真正利用多核資源,例如通過C/C++擴展來實現多線程/多進程,以及直接利用Python的多進程模塊multiprocessing來進行多進程編程。本文主要嘗試僅僅通過python內置的multiprocessing模塊對自己的動力學計算程序來進行優(yōu)化和效率提升,其中:-實現了單機利用多核資源來實現并行并進行加速對比-使用manager模塊實現了簡單的多機的分布式計算本文并不是對Python的multiprocessing模塊的接口進行翻譯介紹,需要熟悉multiprocessing的童鞋可以參考官方文檔/2/library/multiprocessing.html。正文最近想用自己的微觀動力學程序進行一系列的求解并將結果繪制成二維Map圖進行可視化,這樣就需要對二維圖上的多個點進行計算并將結果收集起來并進行繪制,由于每個點都需要進行一次ODE積分以及牛頓法求解方程組,因此要串行地繪制整張圖可能會遇到極低的效率問題尤其是對參數進行測試的時候,每畫一張圖都需要等很久的時間。其中繪制的二維圖中每個點都是獨立計算的,于是很自然而然的想到了進行并行化處理。串行的原始版本由于腳本比較長,而且實現均為自己的程序,腳本的大致結構如下,本質是一個二重循環(huán),循環(huán)的變量分別為反應物氣體(O2和CO)的分壓的值:整體過程就這么簡單,我需要做的就是使用multiprocessing的接口來對這個二重循環(huán)進行并行化。使用單核串行繪制100個點所需要的時間如下,總共花了240.76秒:二維map圖繪制的效果如下:進行多進程并行處理multiprocessing模塊multiprocessing模塊提供了類似threading模塊的接口,并對進程的各種操作進行了良好的封裝,提供了各種進程間通信的接口例如Pipe,Queue等等,可以幫助我們實現進程間的通信,同步等操作。使用Process類來動態(tài)創(chuàng)建進程實現并行multiprocessing模塊提供了Process能讓我們通過創(chuàng)建進程對象并執(zhí)行該進程對象的start方法來創(chuàng)建一個真正的進程來執(zhí)行任務,該接口類似threading模塊中的線程類Thread.但是當被操作對象數目不大的時候可以使用Process動態(tài)生成多個進程,但是如果需要的進程數一旦很多的時候,手動限制進程的數量以及處理不同進程返回值會變得異常的繁瑣,因此這個時候我們需要使用進程池來簡化操作。使用進程池來管理進程multiprocessing模塊提供了一個進程池Pool類,負責創(chuàng)建進程池對象,并提供了一些方法來講運算任務offload到不同的子進程中執(zhí)行,并很方便的獲取返回值。例如我們現在要進行的循環(huán)并行便很容易的將其實現。對于這里的單指令多數據流的并行,我們可以直接使用Pool.map()來將函數映射到參數列表中。Pool.map其實是map函數的并行版本,此函數將會阻塞直到所有進程全部結束,而且此函數返回的結果順序仍然不變。首先,我先把針對每對分壓數據的處理過程封裝成一個函數,這樣可以將函數對象傳遞給子進程執(zhí)行。使用兩個核心進行計算,計算時間從240.76s降到了148.61秒,加速比為1.62對不同核心的加速效果進行測試為了查看使用不同核心數對程序效率的改善,我對不同的核心數和加速比進行了測試繪圖,效果如下:運行核心數與程序運行時間:運行核心數與加速比:可見,由于我外層循環(huán)只循環(huán)了10次因此使用的核心數超過10以后核心數的增加并不能對程序進行加速,也就是多余的核心都浪費掉了。使用manager實現簡單的分布式計算前面使用了multiprocessing包提供的接口我們使用了再一臺機器上進行多核心計算的并行處理,但是multiprocessing的用處還有更多,通過multiprocessing.managers模塊,我們可以實現簡單的多機分布式并行計算,將計算任務分布到不同的計算機中運行。Managers提供了另外的多進程通信工具,他提供了在多臺計算機之間共享數據的接口和數據對象,這些數據對象全部都是通過代理類實現的,比如ListProxy和DictProxy等等,他們都實現了與原生list和dict相同的接口,但是他們可以通過網絡在不同計算機中的進程中進行共享。關于managers模塊的接口的詳細使用可以參考官方文檔:/2/library/multiprocessing.html#managers好了現在我們開始嘗試將繪圖程序改造成可以在多臺計算機中分布式并行的程序。改造的主要思想是:1.使用一臺計算機作為服務端(server),此臺計算機通過一個Manager對象來管理共享對象,任務分配以及結果的接收,并再收集結果以后進行后處理(繪制二維map圖)。2.其他多臺計算機可以作為客戶端來接收server的數據進行計算,并將結果傳到共享數據中,讓server可以收集。同時再client端可以同時進行上文所實現的多進程并行來充分利用計算機的多核優(yōu)勢。大致可總結為下圖:服務進程首先服務端需要一個manager對象來管理共享對象BaseManager.register是一個類方法,它可以將某種類型或者可調用的對象綁定到manager對象并共享到網絡中,使得其他在網絡中的計算機能夠獲取相應的對象。例如,JobManager.register('get_jobid_queue',callable=lambda:jobid_queue)我就將一個返回任務隊列的函數對象同manager對象綁定并共享到網絡中,這樣在網絡中的進程就可以通過自己的manager對象的get_jobid_queue方法得到相同的隊列,這樣便實現了數據的共享.創(chuàng)建manager對象的時候需要兩個參數,address,便是manager所在的ip以及用于監(jiān)聽與服務端連接的端口號,例如我如果是在內網中的地址的5000端口進行監(jiān)聽,那么此參數可以是(',5000)`authkey,顧名思義,就是一個認證碼,用于驗證客戶端時候可以連接到服務端,此參數必須是一個字符串對象.進行任務分配上面我們將一個任務隊列綁定到了manager對象中,現在我需要將隊列進行填充,這樣才能將任務發(fā)放到不同的客戶端來進行并行執(zhí)行。這里所謂的任務其實就是相應參數在list中的index值,這樣不同計算機中得到的結果可以按照相應的index將結果填入到結果列表中,這樣服務端就能在共享的網絡中收集各個計算機計算的結果。啟動服務端進行監(jiān)聽任務進程服務進程負責進行簡單的任務分配和調度,任務進程則只負責獲取任務并進行計算處理。在任務進程(客戶端)中基本代碼與我們上面單機中的多核運行的腳本基本相同(因為都是同一個函數處理不同的數據),但是我們也需要為客戶端創(chuàng)建一個manager來進行任務的獲取和返回。在客戶端我們仍然可以多進程利用多核資源來加速計算。下面我將在3臺在同一局域網中的電腦來進行簡單的分布式計算測試,-其中一臺是實驗室器群中的管理節(jié)點,內網ip為45-另一臺為集群中的一個節(jié)點,共有12個核心-最后一臺為自己的本本,4個核心先在服務端運行服務腳本進行任務分配和監(jiān)聽:pythonserver.py在兩個客戶端運行任務腳本來獲取任務隊列中的任務并執(zhí)行pythonworker.py當任務隊列為空且任務完成時,任務進程終止;當結果列表中的結果收集完畢時,服務進程也會終止。執(zhí)行結果如下圖:上面的panel為服務端監(jiān)聽,左下為自己的筆記本運行結果,右下panel為集群中的其中一個節(jié)點??梢娺\行時間為56.86s,無奈,是我的本子脫了后腿(-_-!)總結本文通過python內置模塊multiprocessing實現了單機內多核并行以及簡單的多臺計算機的分布式并行計算,multiprocessing為我們提供了封裝良好并且友好的接口來使我們的Python程序更方面利用多核資源加速自己的計算程序,希望能對使用python實現并行話的童鞋有所幫助。參考/2/library/multiprocessing.html分布式進程-廖雪峰的官方網站ARTICLES近期熱門文章⊙生成器:關于生成器的那些事兒⊙爬蟲代理:如何構建爬蟲代理服務⊙地理編碼:怎樣用Python實現地理編碼⊙nginx日志:使用Python分析nginx日志⊙淘寶女郎:一個批量抓取淘女郎寫真圖片的爬蟲⊙IP代理池:突破
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度飛防作業(yè)無人機數據服務與共享合同
- 二零二五年度加油站設備租賃及維護合同
- 2025版企業(yè)勞動合同工資支付范本合同模板2篇
- 2025年度安置房買賣合同書協議書:城市保障性住房租賃合同
- 二零二五年度商業(yè)借款合同糾紛案件代理詞委托書
- 2025版股權質押登記服務合同模板3篇
- 二零二五年度寵物租賃與寵物寄養(yǎng)連鎖經營協議
- 2024年版商鋪買賣合同規(guī)范文本3篇
- 2025版學校學生創(chuàng)新創(chuàng)業(yè)孵化基地建設合同3篇
- 2025年度四人合伙經營海鮮酒樓協議2篇
- 中國美術史智慧樹知到答案章節(jié)測試2023年西北師范大學
- 管理ABC-干嘉偉美團網COO
- 洛陽白馬寺景點介紹中文及英文
- 材料工程基礎(山東聯盟)智慧樹知到答案章節(jié)測試2023年煙臺大學
- 銷售破冰話術
- 酒店預訂系統
- 2023-2024學年河北省秦皇島市小學數學五年級上冊期末高分通關考試題
- 2023年銀行安全保衛(wèi)知識考試題庫(含答案)
- YB/T 4090-2000超高功率石墨電極
- GB/T 39194-2020真空低壓滲碳高壓氣淬熱處理技術要求
- 《廚房里的物質與變化》實驗記錄單
評論
0/150
提交評論