国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

淺談Python中的全局鎖(GIL)問題

2020-02-16 00:36:38
字體:
來源:轉載
供稿:網友

CPU-bound(計算密集型) 和I/O bound(I/O密集型)

計算密集型任務(CPU-bound) 的特點是要進行大量的計算,占據著主要的任務,消耗CPU資源,一直處于滿負荷狀態。比如復雜的加減乘除、計算圓周率、對視頻進行高清解碼等等,全靠CPU的運算能力。這種計算密集型任務雖然也可以用多任務完成,但是任務越多,花在任務切換的時間就越多,CPU執行任務的效率就越低,所以,要最高效地利用CPU,計算密集型任務同時進行的數量應當等于CPU的核心數。

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

IO密集型任務(I/O bound)的特點是指磁盤IO、網絡IO占主要的任務,CPU消耗很少,任務的大部分時間都在等待IO操作完成(因為IO的速度遠遠低于CPU和內存的速度)。

IO密集型任務執行期間,99%的時間都花在IO上,花在CPU上的時間很少,因此,用運行速度極快的C語言替換用Python這樣運行速度極低的腳本語言,完全無法提升運行效率。

對于IO密集型任務,任務越多,CPU效率越高,但也有一個限度。常見的大部分任務都是IO密集型任務,比如請求網頁、讀寫文件等。當然我們在Python中可以利用sleep達到IO密集型任務的目的。

對于IO密集型任務,最合適的語言就是開發效率最高(代碼量最少)的語言,腳本語言是首選,C語言最差。

全局鎖問題:

解釋器被一個全局解釋器鎖保護著,它確保任何時候都只有一個Python線程執行。

GIL最大的問題就是Python的多線程程序并不能利用多核CPU的優勢 (比如一個使用了多個線程的計算密集型程序只會在一個單CPU上面運行)。

GIL只會影響到那些嚴重依賴CPU的程序(比如計算型的)

如果你的程序大部分只會設計到I/O,比如網絡交互,那么使用多線程就很合適, 因為它們大部分時間都在等待。實際上,你完全可以放心的創建幾千個Python線程, 現代操作系統運行這么多線程沒有任何壓力,沒啥可擔心的。

解決方案:

首先,如果你完全工作于Python環境中,你可以使用 multiprocessing 模塊來創建一個進程池, 并像協同處理器一樣的使用它。

pool = None# Performs a large calculation (CPU bound)def some_work(args): ... return resultdef some_thread(): while True:  ...  r = pool.apply(some_work, (args))  ...# Initiaze the poolif __name__ == '__main__': import multiprocessing pool = multiprocessing.Pool()

另外一個解決GIL的策略是使用C擴展編程技術。 主要思想是將計算密集型任務轉移給C,跟Python獨立,在工作的時候在C代碼中釋放GIL。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彰武县| 康马县| 阳新县| 应城市| 清水县| 靖江市| 凌源市| 大余县| 渭源县| 新和县| 大宁县| 关岭| 清镇市| 民县| 嵊泗县| 赤城县| 宜良县| 洪雅县| 镇远县| 夏邑县| 泾阳县| 灵武市| 安龙县| 文登市| 固安县| 五大连池市| 鱼台县| 绥中县| 临夏市| 南召县| 临江市| 巩留县| 石棉县| 凤凰县| 朝阳市| 泗水县| 新郑市| 广州市| 习水县| 龙门县| 喜德县|