Python GIL

轉自:https://blog.csdn.net/weixin_41594007/article/details/79485847

Python GIL

在進行GIL講解之前,我們可以先回顧一下并行和并發的區別:
并行:多個CPU同時執行多個任務,就好像有兩個程序,這兩個程序是真的在兩個不同的CPU內同時被執行。

并發:CPU交替處理多個任務,還是有兩個程序,但是只有一個CPU,會交替處理這兩個程序,而不是同時執行,只不過因為CPU執行的速度過快,而會使得人們感到是在“同時”執行,執行的先后取決于各個程序對于時間片資源的爭奪。大家可以參考下圖的實物圖就行理解:



并行和并發同屬于多任務,目的是要提高CPU的使用效率。這里需要注意的是,一個CPU永遠不可能實現并行,即一個CPU不能同時運行多個程序,但是可以在隨機分配的時間片內交替執行(并發),就好像一個人不能同時看兩本書,但是卻能夠先看第一本書半分鐘,再看第二本書半分鐘,這樣來回切換。

接下來我們來看看進程和線程之間的區別:

兩個多線程同時執行死循環,查看單個CPU的使用率:



兩個多線程同時執行死循環,查看兩個CPU的使用率:



兩個多進程同時執行死循環,查看兩個CPU使用率:



也就是說,多線程并不會充分調用兩個CPU,而是會像在一個CPU上充分運轉,而多進程則是會完全調用兩個CPU,同時執行;

Guido van Rossum(吉多·范羅蘇姆)創建python時就只考慮到單核cpu,解決多線程之間數據完整性和狀態同步的最簡單方法自然就是加鎖, 于是有了GIL這把超級大鎖。因為cpython解析只允許擁有GIL全局解析器鎖才能運行程序,這樣就保證了保證同一個時刻只允許一個線程可以使用cpu。由于大量的程序開發者接收了這套機制,現在代碼量越來越多,已經不容易通過c代碼去解決這個問題。

什么是GIL?

即全局解釋器所(global interpreter lock),每個線程在執行時候都需要先獲取GIL,保證同一時刻只有一個線程可以執行代碼,即同一時刻只有一個線程使用CPU,也就是說多線程并不是真正意義上的同時執行。


那么,我們改如何解決GIL鎖的問題呢?

1.更換cpython為jpython(不建議)

2.使用多進程完成多線程的任務

3.在使用多線程可以使用c語言去實現

以下是幾個面試會遇到的問題,希望對大家有所幫助:

問題1: 什么時候會釋放Gil鎖,
答 :??
1 遇到像 i/o操作這種 會有時間空閑情況 造成cpu閑置的情況會釋放Gil
2 會有一個專門ticks進行計數 一旦ticks數值達到100 這個時候釋放Gil鎖 線程之間開始競爭Gil鎖(說明:
? ? ticks這個數值可以進行設置來延長或者縮減獲得Gil鎖的線程使用cpu的時間)

問題2: 互斥鎖和Gil鎖的關系

Gil鎖? : 保證同一時刻只有一個線程能使用到cpu
互斥鎖 : 多線程時,保證修改共享數據時有序的修改,不會產生數據修改混亂


首先假設只有一個進程,這個進程中有兩個線程 Thread1,Thread2, 要修改共享的數據date, 并且有互斥鎖

執行以下步驟

(1)多線程運行,假設Thread1獲得GIL可以使用cpu,這時Thread1獲得 互斥鎖lock,Thread1可以改date數據(但并
沒有開始修改數據)

(2)Thread1線程在修改date數據前發生了 i/o操作 或者 ticks計數滿100 (注意就是沒有運行到修改data數據),這個
時候 Thread1 讓出了Gil,Gil鎖可以被競爭

(3) Thread1 和 Thread2 開始競爭 Gil (注意:如果Thread1是因為 i/o 阻塞 讓出的Gil Thread2必定拿到Gil,如果
Thread1是因為ticks計數滿100讓出Gil 這個時候 Thread1 和 Thread2 公平競爭)

(4)假設 Thread2正好獲得了GIL, 運行代碼去修改共享數據date,由于Thread1有互斥鎖lock,所以Thread2無法更改共享數據
date,這時Thread2讓出Gil鎖 , GIL鎖再次發生競爭?


(5)假設Thread1又搶到GIL,由于其有互斥鎖Lock所以其可以繼續修改共享數據data,當Thread1修改完數據釋放互斥鎖lock,
Thread2在獲得GIL與lock后才可對data進行修改

以上描述了 互斥鎖和Gil鎖的 一個關系

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

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

相關文章

sqli-lab——Writeup21~38(各種過濾繞過WAF和)

Less-21 Cookie Injection- Error Based- complex - string ( 基于錯誤的復雜的字符型Cookie注入) base64編碼,單引號,報錯型,cookie型注入。 本關和less-20相似,只是cookie的uname值經過base64編碼了。 登錄后頁面:…

Libtorch報錯:terminate called after throwing an instance of ‘c10::Error‘ what():isTensor()INTERNAL ASS

Libtorch報錯:terminate called after throwing an instance of ‘c10::Error’ what(): isTensor() INTERNAL ASSERT FAILED 報錯 問題出現在筆者想要將 yolov5 通過 PyTorch 的 C 接口 Libtorch 部署到樹莓派上。 完整報錯信息: terminate called …

sqli-lab——Writeup(38~over)堆疊等......

知識點: 1.堆疊注入原理(stacked injection) 在SQL中,分號(;)是用來表示一條sql語句的結束。試想一下我們在 ; 結束一個sql語句后繼續構造下一條語句,會不會一起執行?因此這個想法…

mysql常規使用(建立,增刪改查,視圖索引)

目錄 1.數據庫建立 2.增刪改查 3.視圖建立: 1.數據庫建立 mysql> mysql> show databases; ----------------------------------- | Database | ----------------------------------- | information_schema | | ch…

php操作mysql數據庫

phpmyadmin phpadmin是一個mysql圖形化管理工具,是一款實用php開發的mysql苦戶端軟件,基于web跨平臺的管理系統,支持簡體中文,官網:www.phpmyadmin.net可以下載免費最新版。提供圖形化操作界面,完成對mysq…

C:C++ 函數返回多個參數

C/C 函數返回多個參數 轉自:https://blog.csdn.net/onlyou2030/article/details/48174461 筆者是 Python 入門的,一直很困惑 C/C 中函數如何返回多個參數。 如果一個函數需要返回多個參數,可以采用以下兩種方法: 傳引用或指針…

sql預編譯

一.數據庫預編譯起源: 數據庫接受sql語句,需要解析和制定執行,中間需要花費一段時間. 有時候同一語句可能會多次執行, 那么就會造成資源的浪費 如何減少編譯執行的時間 ? 就有了預編譯,預編譯是將這類語句提前用占位符替代,一次編譯,多次執行. 預編譯后的執行代碼會被緩存下來…

C++中智能指針的原理、使用、實現

C中智能指針的原理、使用、實現 轉自:https://www.cnblogs.com/wxquare/p/4759020.html 1 智能指針的作用 C程序設計中使用堆內存是非常頻繁的操作,堆內存的申請和釋放都由程序員自己管理。程序員自己管理堆內存可以提高了程序的效率,但是…

Xctf練習sql注入--supersqli

三種方法 方法一 1 回顯正常 1’回顯不正常,報sql語法錯誤 1’ -- 回顯正常,說明有sql注入點,應該是字符型注入(# 不能用) 1’ order by 3 -- 回顯失敗,說明有2個注入點 1’ union select 1,2 -- 回顯顯示過濾語句: 1’; show databases -- 爆數據庫名 -1’; show tables …

深拷貝與淺拷貝、值語義與引用語義對象語義 ——以C++和Python為例

深拷貝與淺拷貝、值語義與引用語義/對象語義 ——以C和Python為例 值語義與引用語義(對象語義) 本小節參考自:https://www.cnblogs.com/Solstice/archive/2011/08/16/2141515.html 概念 在任何編程語言中,區分深淺拷貝的關鍵都…

一次打卡軟件的實戰滲透測試

直接打卡抓包, 發現有疑似企業網站,查ip直接顯示以下頁面 直接顯示了后臺安裝界面…就很有意思 探針和phpinfo存在 嘗試連接mysql失敗 fofa掃描為阿里云服務器 找到公司官網使用nmap掃描,存在端口使用onethink 查詢onethink OneThink是一個開源的內容管理框架,…

C++中類的拷貝控制

C中類的拷貝控制 轉自:https://www.cnblogs.com/ronny/p/3734110.html 1,什么是類的拷貝控制 當我們定義一個類的時候,為了讓我們定義的類類型像內置類型(char,int,double等)一樣好用,我們通常需要考下面…

centos7ubuntu搭建Vulhub靶場(推薦Ubuntu)

這里寫目錄標題一.前言總結二.成功操作:三.出現報錯:四.vulhub使用正文:一.前言總結二.成功操作:三.出現報錯:四.vulhub使用看完點贊關注不迷路!!!! 后續繼續更新優質安全內容!!!!!一.前言總結 二.成功操作&#xff1…

使用 PyTorch 數據讀取,JAX 框架來訓練一個簡單的神經網絡

使用 PyTorch 數據讀取,JAX 框架來訓練一個簡單的神經網絡 本文例程部分主要參考官方文檔。 JAX簡介 JAX 的前身是 Autograd ,也就是說 JAX 是 Autograd 升級版本,JAX 可以對 Python 和 NumPy 程序進行自動微分。可以通過 Python的大量特征…

Yapi Mock 遠程代碼執行漏洞

跟風一波復現Yapi 漏洞描述: YApi接口管理平臺遠程代碼執行0day漏洞,攻擊者可通過平臺注冊用戶添加接口,設置mock腳本從而執行任意代碼。鑒于該漏洞目前處于0day漏洞利用狀態,強烈建議客戶盡快采取緩解措施以避免受此漏洞影響 …

C++ ACM模式輸入輸出

C ACM模式輸入輸出 以下我們都以求和作為題目要求,來看一下各種輸入輸出應該怎么寫。 1 只有一個或幾個輸入 輸入樣例: 3 5 7輸入輸出模板: int main() {int a, b, c;// 接收有限個輸入cin >> a >> b >> c;// 輸出結果…

CVE-2017-10271 WebLogic XMLDecoder反序列化漏洞

漏洞產生原因: CVE-2017-10271漏洞產生的原因大致是Weblogic的WLS Security組件對外提供webservice服務,其中使用了XMLDecoder來解析用戶傳入的XML數據,在解析的過程中出現反序列化漏洞,導致可執行任意命令。攻擊者發送精心構造的…

樹莓派攝像頭 C++ OpenCV YoloV3 實現實時目標檢測

樹莓派攝像頭 C OpenCV YoloV3 實現實時目標檢測 本文將實現樹莓派攝像頭 C OpenCV YoloV3 實現實時目標檢測,我們會先實現樹莓派對視頻文件的逐幀檢測來驗證算法流程,成功后,再接入攝像頭進行實時目標檢測。 先聲明一下筆者的主要軟硬件配…

【實戰】記錄一次服務器挖礦病毒處理

信息收集及kill: 查看監控顯示長期CPU利用率超高,懷疑中了病毒 top 命令查看進程資源占用: netstat -lntupa 命令查看有無ip進行發包 netstat -antp 然而并沒有找到對應的進程名 查看java進程和solr進程 ps aux :查看所有進程…

ag 搜索工具參數詳解

ag 搜索工具參數詳解 Ag 是類似ack, grep的工具,它來在文件中搜索相應關鍵字。 官方列出了幾點選擇它的理由: 它比ack還要快 (和grep不在一個數量級上)它會忽略.gitignore和.hgignore中的匹配文件如果有你想忽略的文…