python之GIL鎖詳解

目錄

1.GIL是什么以及影響

2.為什么會有GIL鎖?


1.GIL是什么以及影響

在Python中,多線程的并發性受到全局解釋器鎖(GIL,Global Interpreter Lock)的影響。GIL是CPython(Python的官方實現)中的一個特性,它的主要目的是確保在任何時候只有一個線程在執行Python字節碼。

這是因為CPython的內存管理不是線程安全的,所以需要一個鎖來防止多個線程同時修改或訪問共享的內存區域。

然而,這并不意味著Python多線程不能實現真正的并發。GIL允許線程之間進行切換,但每次只有一個線程能夠持有GIL并執行Python字節碼。當線程需要執行I/O操作或調用某些內置函數(如time.sleep)時,它可能會釋放GIL,允許其他線程獲得執行權。這種切換機制使得Python多線程在某些情況下(如I/O密集型任務)仍然可以實現并發性能的提升。

但是,對于計算密集型任務,Python多線程可能無法充分利用多核CPU的優勢,因為GIL限制了同一時間只有一個線程能夠執行Python字節碼。在這種情況下,使用多進程(multiprocessing)可能是更好的選擇,因為多進程允許每個進程擁有自己的GIL和內存空間,從而實現真正的并行執行。

總之,GIL的作用是確保CPython的內存管理在多線程環境中的線程安全性,但它也限制了Python多線程在計算密集型任務中的并發性能。因此,在選擇使用多線程還是多進程時,需要根據具體的任務類型和性能需求進行權衡。

GIL并不是Python的特性,Python完全可以不依賴于GIL。

2.為什么會有GIL鎖?

原因在于python的內存管理機制采用引用計數機制,引用計數這個變量不是線程安全的,需要用GIL全局鎖來進行數據保護。

python中的對象使用引用計數為主,標記清楚和隔代回收為輔來進行內存管理。所有python腳本中創建的對象,都會配備一個引用計數,來記錄有多少個指針來指向它。以全局變量a為例,每有一個線程若調用了a,則a的引用計數加1。

注意:全局變量的引用計數并不直接與線程數量相關。全局變量(或任何Python對象)的引用計數僅與其被引用的次數有關。比如有10個線程,但只有9個線程引用該變量,則引用計數為9。

當一個線程引用一個全局變量時,該變量的引用計數增加;當引用被刪除(比如線程結束使得引用被刪除)或超出作用域(比如局部變量的結束)時,引用計數減少。另外每個線程可以獨立地引用或取消引用全局變量,從而影響其引用計數。

當對象的引用計數為0時,Python的垃圾回收器會釋放該對象占用的內存。但是,請注意,這并不意味著對象占用的內存會立即返回給操作系統;它可能會被Python的內存管理器保留以供將來使用。

那么為什么需要GIL鎖呢,因為這個引用計數變量不是線程安全的,舉例說明如下:

  1. 假設開始時只有主線程,引用一個數據(a=100,引用計數x為1),
  2. 若再開啟2個python子線程,每個線程的開啟都會使得x進行自增1的操作(x+=1),意味著有多個線程對同一個資源的競爭,如果有GIL鎖存在的話,x最后正常會變成3
  3. 但是如果沒有GIL鎖的話,x可能最終是2。這造成的后果是,當第1個子線程結束時,會把引用計數x減少為1;當第2個線程結束時,會把引用計數x減少為0,這時變量a會被釋放所占用的內存。之后若主線程再次試圖訪問a這個數據時,將會程序異常,會無法找到有效的內存,程序會出錯。

總結GIL存在的目的:GIL的存在是為了防止在多個線程同時執行Python字節碼時,由于內存管理(如引用計數)的并發操作導致的競態條件。GIL確保在任何時候只有一個線程在執行Python字節碼。


end

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38261.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38261.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38261.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vscode下無法識別node、npm的問題

node : 無法將“node”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱 因為node是在cmd安裝的,是全局安裝的,并不是在這個項目里安裝的。 解決方案: 1.在vscode的控制臺,針對一個項目安裝特定版本的node; 2.已經…

C++(Python)肥皂泡沫普拉托邊界膜曲面模型算法

🎯要點 🎯肥皂泡二維流體模擬 | 🎯泡沫普拉托邊界膜曲面模型算法演化厚度變化 | 🎯螺旋曲面三周期最小結構生成 📜皂膜用例:Python計算物理粒子及拉格朗日和哈密頓動力學 | Python和MATLAB粘性力接觸力動…

SAP系統中的應收賬款(客戶主數據,日常交易,催收,爭議管理)

1. 客戶主數據 Customer Accounts (客戶賬戶):客戶賬戶由兩部分General Data(通用數據)和Company Code Data(公司代碼段數據)組成。通用數據是在client級別獨立于公司代碼的數據,例如客戶的地址&#xff0…

鴻蒙開發設備管理:【@ohos.multimodalInput.inputEventClient (注入按鍵)】

注入按鍵 InputEventClient模塊提供了注入按鍵能力。 說明: 本模塊首批接口從API version 8開始支持。后續版本的新增接口,采用上角標單獨標記接口的起始版本。本模塊接口均為系統接口,三方應用不支持調用。 導入模塊 import inputEventCli…

愛情再啟:莊國棟笑談“玫瑰人生”愛情覺悟

莊國棟,這位電視劇《玫瑰的故事》中的男主角, 最近在一次采訪中坦言:“如果給我一次重來的機會, 我絕對會毫不猶豫地選擇愛情!” 聽到這話, 我不禁想,莊先生,您是不是被劇里的玫瑰…

Solidworke學習(裝配體3)

目錄 本節學習內容: 一、高級配合 (1)對稱配合 (2)寬度配合 (3)距離配合 二、機械配合 (1)凸輪配合 (2)槽口配合 三、快捷菜單 本節學習…

python工作目錄與文件目錄

工作目錄 文件目錄:文件所在的目錄 工作目錄:執行python命令所在的目錄 D:. | main.py | ---data | data.txt | ---model | | model.py | | train.py | | __init__.py | | | ---nlp | | | bert.py | …

計算機網絡期末復習(大題+小題)

計算機網絡期末復習 一、計算機網絡概述 Point 1 計算機網絡就是以傳輸信息為基本目的,用通信線路和通信設備將多個計算機連接起來的計算機系統的集合。由自治的計算機互聯起來的結合體。 Point 2 按網絡的覆蓋范圍進行分類 (1)局域網*…

解鎖Transformer的魯棒性:深入分析與實踐指南

🛡? 解鎖Transformer的魯棒性:深入分析與實踐指南 Transformer模型自從由Vaswani等人在2017年提出以來,已經成為自然語言處理(NLP)領域的明星模型。然而,模型的魯棒性——即模型在面對異常、惡意或不尋常…

人機交互新維度|碩博電子發布雙編碼器操作面板、無線操作面板等新品

6月15日,碩博電子召開了一場新品發布會,向業界展示了多項前沿技術成果,其中備受矚目的當屬SPM-KEYP-D08雙編碼器操作面板、SPM-KEYP-D16W無線操作面板、SPR-HT-XK12A無線手持發射端以及SPQ-WT-B01灑水車專用控制面板。這些創新產品的亮相&…

文心一言 VS 訊飛星火 VS chatgpt (292)-- 算法導論21.3 5題

五、證明:任何具有 m 個 MAKE-SET、UNION 和 FIND-SET 操作的序列,這里所有的 LINK 操作都出現在 FIND-SET 操作之前,如果同時使用路徑壓縮和按秩合并啟發式策略,則這些操作只需 O(m) 的時間。在同樣情況下,如果只使用…

Class Constructors and Destructors (類的構造函數和析構函數)

Class Constructors and Destructors [類的構造函數和析構函數] 1. Declaring and Defining Constructors (聲明和定義構造函數)2. Using Constructors (使用構造函數)3. Default Constructors (默認構造函數)4. Destructors (析構函數)5. Improving the Stock Class (改進 Sto…

MT1597 平行線

題目 用下面的數據類型表示線: struct POINT { //點 int x, y; //坐標值x和y } ; struct LINE { //線 POINT s, e; //線的兩端 } ; 輸入2個線段的端點的坐標值x和y,判斷兩條線段所在直線是否為平行線。如果兩線段共線,判為不平行。 輸入…

強強聯合:Apache Kylin與Impala的集成之道

🔗 強強聯合:Apache Kylin與Impala的集成之道 在大數據時代,Apache Kylin和Impala都是分析型數據庫的佼佼者,分別以預計算的OLAP引擎和高性能的SQL on Hadoop解決方案而聞名。將兩者集成,可以充分利用Kylin的預計算能…

C程序設計譚浩強第五版

第三章 程序習題 1、第2題2、第2題3、第3題4、第4題 1、第2題 假如我國國民生產總值的年增長率為7%, 計算10年后我國國民生產總值與現在相比增長多少百分比。計算公式為 p ( 1 r ) n p (1r)^n p(1r)n ,其中r為年增長率,n為年數,p為與現在…

thinkphp通過with查詢,并通過關聯表進行篩選

直接添加一個where條件,然后條件里面用表名.字段即可,非常方便 需要注意的一點是在fastadmin里面,$this->auth->getGroupIds()這樣獲取是會獲取到緩存里面的值,必須重新登錄之后才可以得到最新的用戶組,這個問題導致困擾了我一晚上 $usage $this->model->with([us…

Oracle數據庫教程

Oracle數據庫教程 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!今天我們將深入探討Oracle數據庫的基礎知識、特性以及在Java中的應用。 什么是Oracle數據庫&…

前端小案例,用錨點(哈希值)實現Tab組件切換

在前端開發的世界里,使用現代化的技術和方法來實現常見的組件是非常重要的。今天,我們將通過一個具體的案例來展示如何使用現代化的CSS和ES6來創建一個優雅且功能豐富的Tab組件。本文將詳細介紹實現思路、代碼分析,并提供一些實用的開發技巧。…

25 防火墻基礎操作

1 防火墻進入WEB頁面操作 華三防火墻的默認用戶:admin/密碼:admin 將IP地址改在同一網段的信息 在防火墻的管理地址 GE/0/0/1:192.168.0.1 主機的地址是:192.168.0.101 思考一下為什么Ping不通 security-zone name Management import interface GigabitEthernet1/…

音視頻開發34 FFmpeg 編碼- 將h264和acc文件打包成flv文件

FFmpeg合成流程 示例本程序會?成?個合成的?頻和視頻流,并將它們編碼和封裝輸出到輸出?件,輸出格式是根據?件 擴展名?動猜測的。 示例的流程圖如下所示。 ffmpeg 的 Mux 主要分為 三步操作: avformat_write_header : 寫?…