淺談Python中的全局鎖(GIL)問題
CPU-bound(計算密集型) 和I/O bound(I/O密集型)
計算密集型任務(wù)(CPU-bound) 的特點是要進行大量的計算,占據(jù)著主要的任務(wù),消耗CPU資源,一直處于滿負(fù)荷狀態(tài)。比如復(fù)雜的加減乘除、計算圓周率、對視頻進行高清解碼等等,全靠CPU的運算能力。這種計算密集型任務(wù)雖然也可以用多任務(wù)完成,但是任務(wù)越多,花在任務(wù)切換的時間就越多,CPU執(zhí)行任務(wù)的效率就越低,所以,要最高效地利用CPU,計算密集型任務(wù)同時進行的數(shù)量應(yīng)當(dāng)?shù)扔贑PU的核心數(shù)。
計算密集型任務(wù)由于主要消耗CPU資源,因此,代碼運行效率至關(guān)重要。Python這樣的腳本語言運行效率很低,完全不適合計算密集型任務(wù)。對于計算密集型任務(wù),最好用C語言編寫。
IO密集型任務(wù)(I/O bound)的特點是指磁盤IO、網(wǎng)絡(luò)IO占主要的任務(wù),CPU消耗很少,任務(wù)的大部分時間都在等待IO操作完成(因為IO的速度遠遠低于CPU和內(nèi)存的速度)。
IO密集型任務(wù)執(zhí)行期間,99%的時間都花在IO上,花在CPU上的時間很少,因此,用運行速度極快的C語言替換用Python這樣運行速度極低的腳本語言,完全無法提升運行效率。
對于IO密集型任務(wù),任務(wù)越多,CPU效率越高,但也有一個限度。常見的大部分任務(wù)都是IO密集型任務(wù),比如請求網(wǎng)頁、讀寫文件等。當(dāng)然我們在Python中可以利用sleep達到IO密集型任務(wù)的目的。
對于IO密集型任務(wù),最合適的語言就是開發(fā)效率最高(代碼量最少)的語言,腳本語言是首選,C語言最差。
全局鎖問題:
解釋器被一個全局解釋器鎖保護著,它確保任何時候都只有一個Python線程執(zhí)行。
GIL最大的問題就是Python的多線程程序并不能利用多核CPU的優(yōu)勢 (比如一個使用了多個線程的計算密集型程序只會在一個單CPU上面運行)。
GIL只會影響到那些嚴(yán)重依賴CPU的程序(比如計算型的)
如果你的程序大部分只會設(shè)計到I/O,比如網(wǎng)絡(luò)交互,那么使用多線程就很合適, 因為它們大部分時間都在等待。實際上,你完全可以放心的創(chuàng)建幾千個Python線程, 現(xiàn)代操作系統(tǒng)運行這么多線程沒有任何壓力,沒啥可擔(dān)心的。
解決方案:
首先,如果你完全工作于Python環(huán)境中,你可以使用 multiprocessing 模塊來創(chuàng)建一個進程池, 并像協(xié)同處理器一樣的使用它。
pool = None # Performs a large calculation (CPU bound) def some_work(args): ... return result def some_thread(): while True: ... r = pool.apply(some_work, (args)) ... # Initiaze the pool if __name__ == '__main__': import multiprocessing pool = multiprocessing.Pool()
另外一個解決GIL的策略是使用C擴展編程技術(shù)。 主要思想是將計算密集型任務(wù)轉(zhuǎn)移給C,跟Python獨立,在工作的時候在C代碼中釋放GIL。
以上這篇淺談Python中的全局鎖(GIL)問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python區(qū)分不同數(shù)據(jù)類型的方法
這篇文章主要介紹了python區(qū)分不同數(shù)據(jù)類型的方法實例以及相關(guān)知識點,需要的朋友們學(xué)習(xí)下。2019-10-10python中的class_static的@classmethod的巧妙用法
python中的class_static的@classmethod的使用 classmethod的使用,主要針對的是類而不是對象,在定義類的時候往往會定義一些靜態(tài)的私有屬性,今天通過示例代碼看下classmethod的妙用2021-06-06Pycharm-community-2020.2.3 社區(qū)版安裝教程圖文詳解
這篇文章主要介紹了Pycharm-community-2020.2.3 社區(qū)版安裝教程圖文詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12Python Django框架實現(xiàn)應(yīng)用添加logging日志操作示例
這篇文章主要介紹了Python Django框架實現(xiàn)應(yīng)用添加logging日志操作,結(jié)合實例形式分析了Django框架中添加Python內(nèi)建日志模塊相關(guān)操作技巧,需要的朋友可以參考下2019-05-05