當前位置:
首頁 > 最新 > Python的分散式進程

Python的分散式進程

ThreadLocal

多線程環境下,每個線程都有自己的數據,線程使用局部變數比使用全局變數好,如果使用全局變數必須加鎖。不過局部變數傳遞起來比較麻煩。

如果用dict存放所有的對象,然後以thread自身作為key獲得線程對應的對象是可以的,就是獲取方式不夠簡單。

可以不用查dict,自動做這件事。

一個ThreadLocal變數雖然是全局變數,但每個線程都只能讀寫自己線程的獨立副本,互不干擾。ThreadLocal解決了參數在一個線程中各個函數之間互相傳遞的問題。

ThreadLocal最常用的地方就是為每個線程綁定一個資料庫連接,HTTP請求,用戶身份信息等,這樣一個線程的所有調用到的處理函數都可以非常方便地訪問這些資源。


多進程模式最大的優點就是穩定性高,因為一個子進程崩潰不會影響主進程和其他子進程。缺點是開銷大,並且操作系統能同時運行的進程數也是有限的。

多線程模式通常比多進程快一點。它致命的缺點就是任何一個線程掛掉都可能直接造成整個進程崩潰,因為所有的線程共享進程的內存。

在多進程和多線程中,只要數量增多,線程和進程的切換都會成問題。

因為切換操作需要保存現場,準備新環境,才能開始執行。切換操作本身也會消耗掉系統的資源,如果切換操作過多,效率會急劇下降。

是否採用多任務的第二個考慮是任務的類型。可以把任務分為計算密集型和IO密集型。

計算密集型:計算密集型任務的特點是要進行大量的計算,消耗CPU資源,如計算圓周率、對視頻進行高清解碼等等。要最高效地利用CPU,計算密集型任務同時進行的數量應當等於CPU的核心數。

計算密集型任務由於主要消耗CPU資源,因此,代碼運行效率至關重要。Python這樣的腳本語言運行效率很低,完全不適合計算密集型任務。對於計算密集型任務,最好用C語言編寫。

IO密集型:涉及到網路、磁碟IO的任務都是IO密集型任務,這類任務的特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成(因為IO的速度遠遠低於CPU和內存的速度)。對於IO密集型任務,任務越多,CPU效率越高,但也有一個限度。常見的大部分任務都是IO密集型任務,比如Web應用。

IO密集型任務執行期間,99%的時間都花在IO上,花在CPU上的時間很少,因此,用運行速度極快的C語言替換用Python這樣運行速度極低的腳本語言,完全無法提升運行效率。對於IO密集型任務,最合適的語言就是開發效率最高(代碼量最少)的語言,腳本語言是首選,C語言最差。

非同步IO:如果充分利用操作系統提供的非同步IO支持,就可以用單進程單線程模型來執行多任務,這種全新的模型稱為事件驅動模型。

對應到Python語言,單線程的非同步編程模型稱為協程,有了協程的支持,就可以基於事件驅動編寫高效的多任務程序。我們會在後面討論如何編寫協程。

在Thread和Process中,應當優選Process,因為Process更穩定,而且,Process可以分布到多台機器上,而Thread最多只能分布到同一台機器的多個CPU上。

Python的 模塊不但支持多進程,其中 子模塊還支持把多進程分布到多台機器上。一個服務進程可以作為調度者,將任務分布到其他多個進程中,依靠網路通信。由於managers模塊封裝很好,不必了解網路通信的細節,就可以很容易地編寫分散式多進程程序。

比如:如果我們已經有一個通過Queue通信的多進程程序在同一台機器上運行,現在,由於處理任務的進程任務繁重,希望把發送任務的進程和處理任務的進程分布到兩台機器上。怎麼用分散式進程實現?

原有的Queue可以繼續使用,但是,通過managers模塊把Queue通過網路暴露出去,就可以讓其他機器的進程訪問Queue了。

我們先看服務進程,服務進程負責啟動Queue,把Queue註冊到網路上,然後往Queue裡面寫入任務:

當我們在一台機器上寫多進程程序時,創建的Queue可以直接拿來用,但是,在分散式多進程環境下,添加任務到Queue不可以直接對原始的taskqueue進行操作,那樣就繞過了QueueManager的封裝,必須通過manager.gettask_queue()獲得的Queue介面添加。

啟動任務進程:

運行時先啟動服務進程,在啟動任務進程。

任務進程中根本沒有創建Queue的代碼,所以任務進程的Queue對象存儲在服務進程中。

最後服務進程和任務進程的 必須一樣。

Python的分散式進程介面簡單,封裝良好,適合需要把繁重任務分布到多台機器的環境下。

注意Queue的作用是用來傳遞任務和接收結果,每個任務的描述數據量要盡量小。比如發送一個處理日誌文件的任務,就不要發送幾百兆的日誌文件本身,而是發送日誌文件存放的完整路徑,由Worker進程再去共享的磁碟上讀取文件。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

嵌入式Python:如何在U盤安裝綠色版 Python
負基礎都能懂的科普:Python到底憑什麼成為人工智慧的頭牌語言?

TAG:Python |