GIL 鎖或將在 CPython 中成為可選項

来源:https://www.cnblogs.com/edisonfish/archive/2023/08/10/17621092.html
-Advertisement-
Play Games

哈嘍大家好,我是鹹魚 幾天前有媒體報道稱,經過多次辯論,Python 指導委員會打算批准通過 PEP 703 提案,**讓 GIL(全局解釋器)鎖在 CPython 中成為一個可選項** PEP 703 提案主要目標是使 GIL 變成可選項,即允許 Python 解釋器在特定情況下不使用GIL ![ ...


哈嘍大家好,我是鹹魚

幾天前有媒體報道稱,經過多次辯論,Python 指導委員會打算批准通過 PEP 703 提案,讓 GIL(全局解釋器)鎖在 CPython 中成為一個可選項

PEP 703 提案主要目標是使 GIL 變成可選項,即允許 Python 解釋器在特定情況下不使用GIL

image

這將允許 Python 在多核處理器上更好地利用並行性,從而提高多線程程式的性能

PEP 703 提案建議新增一個配置項 --disable-gil ,加了這個選項之後就可以關閉 GIL 鎖,如果想要開啟 GIL 鎖,把 --disable-gil 去掉即可
image
關於 PEP 703 提案的具體內容有興趣的小伙伴們可以去看一下

PEP 703 提案:https://peps.python.org/pep-0703/

接下來我們來看下外媒的這篇報道吧!

原文:https://www.infoworld.com/article/3704248/python-moves-to-remove-the-gil-and-boost-concurrency.html

譯文如下:

經過多次辯論,Python 指導委員會打算批准 PEP 703 提案——”使全局解釋器鎖在 CPython 中可選“

PEP 703 提案是多年來嘗試移除 Python GIL 鎖的最終結果。GIL 鎖的移除消除了多線程的主要障礙,使得 Python 成為真正的多核語言,並且顯著提高其並行工作負載的性能

有了 PEP 703 提案,Python 中對多線程和併發的一流支持離成為現實又近了一步

為什麼要移除 GIL ?

在 python 中,其記憶體管理系統通過維護每個對象的引用數量來跟蹤對象的使用情況(Python 的引用計數機制)

當對象的引用計數減少為 0 時,系統就會刪除該對象

由於 Python 誕生於多處理器系統很少見且多核處理器還未出現的時代,所以這種引用計數機制不是線程安全的

相反,Python 通過一次只允許一個線程訪問對象來實現線程安全,這便是 GIL 的目的

這些年來許多項目都嘗試移除 GIL,它們確實能夠使多線程程式運行地更快,但代價是降低了單線程程式的性能

鑒於絕大多數 Python 應用程式都是單線程,所以這是一個糟糕的權衡。儘管對 GIL 的改進提升了 Pyhton 對多線程應用程式的處理,但仍舊是一個嚴重的瓶頸

Python 的核心開發人員最終決定從 CPython 中移除 GIL,但前提是它可以在不減慢單線程程式速度的情況下完成

沒了 GIL,Python 該如何運行?

當前關於 Python 的無 GIL 版本的提案都提到了使用多種技術來使引用計數線程安全,並且維持單線程程式的速度不變或者僅對其產生最小的影響

下麵是一些關於無 GIL 版本的提案:

  • Biased reference counting(帶偏見的引用計數)

單個線程訪問的對象的引用計數與多個線程訪問的對象的引用計數處理方式不同(單線程的更快一點)

由於大多數對象只被一個線程訪問,因此對單線程程式的影響被降到最低

  • Immortalization(永生)

某些對象(如 None)永遠不會被回收,因此不需要跟蹤它們的引用計數

  • Thread-safe memory allocation(線程安全的記憶體分配)

一個新的 CPython 對象記憶體分配系統將使垃圾收集器中的對象跟蹤更容易,並以線程安全的方式分配記憶體

  • Deferred reference counting(延遲引用計數)

某些對象(如模塊中的頂級函數)的引用計數可以安全地延遲。這樣可以節省時間和資源

  • A revised garbage collector(修改後的垃圾收集器)

CPyhton 垃圾收集器清楚迴圈對象的引用(比如兩個或多個對象互相引用)

無 GIL構建對垃圾收集器做了許多更改,例如刪除用於跟蹤對象的“生成”系統

如何逐步引入無 GIL 的 Python?

實施 PEP 703 是一個長期項目,將會在幾年內分成多個階段進行。在此期間,CPython 解釋器先過渡到使 no-GIL 版本可選,然後是支持,最後成為標準

為了實現這個目標,CPython 的開發者將會為 CPython 添加一個實驗性的 ’no-GIL‘ 構建模式,以便大家可以在有或沒有 GIL 的情況下編譯 CPython 的版本

最終,no-GIL 構建將成為預設值

下麵則是相關的計劃:

1、no-GIL 是可選項

對於 CPython 開發人員和 Python 社區來說,no-GIL CPython 的第一個版本將是實驗性

這個實驗階段有幾個目標:

  • 首先讓 Python 社區的其他成員參與進來。對 Python 的任何重大更改都需要更廣泛的Python 社區的支持。實驗性版本為 Python 用戶提供了一種安全地試驗測試其代碼的方法,並且能夠觀察非線程和線程代碼的行為方式
  • 其次讓 Python 發行版可以選擇(而不是”要求“)提供 no-GIL 的 Python。像 Conda 或WinPython 這樣的 Python 發行版需要保證與原有的 CPython 相容。在過渡階段,安裝的時候可以提供常規或者 no-GIL 版本的 CPython 選項,這將允許 Conda 或WinPython 用戶選擇最適合他們需求的版本
  • 最後確定 no-GIL 項目是否值得。如果社區大規模嘗試 no-GIL 的構建後對結果不滿意,CPython 核心開發人員保留退出的權利。雙重構建意味著在短期內會增加維護負擔,但如果 no-GIL 項目被證明不值得,他們也有退路

2、支持 no-GIL Python

下一階段將提供 no-GIL 構建作為 CPython 支持的替代構建

用戶可以選擇安裝 no-GIL 或 GIL 版本,其中任何一個版本都是正式支持的 CPython 版本,可以接收錯誤修複、安全補丁和更新

這個階段的一大目標是設置一個期限,使 no-GIL 成為預設值

這可能與其他 Python 功能的棄用和刪除在同一時間線上發生——至少兩三個版本,也意味著至少兩到三年

3、no-GIL 成為預設

最後階段是將 CPython 的 no-GIL 版本作為預設版本,並從 CPython 中刪除所有與 GIL 相關的代碼

”我們不想等待太久“,CPython 核心開發人員 Thomas Wouters 寫道,“因為擁有兩種通用的構建模式可能會給社區帶來沉重的負擔(例如,它可以將測試資源和調試場景加倍),但我們也不能急於求成。我們認為可能需要長達五年的時間才能達到這個階段

移除 GIL 的最大挑戰

儘管技術挑戰令人生畏,但這項計劃的最大挑戰不僅僅是技術挑戰。更大的問題是如何使 Python 生態系統的其餘部分與這些變化保持一致且確保 no-GIL 的 Python 不會產生比它解決的問題更多的問題

根據 Wouters 的說法,”...適應非 GIL 構建所需的第三方代碼的任何更改都應該只適用於 GIL 構建(儘管仍然需要解決與舊 Python 版本的向後相容性問題)“

如上所述,另一個重大挑戰是”帶領Python社區的其他成員,” Wouters 說,“……確保我們想要做出的改變,以及我們希望他們做出的改變,是可以接受的

“在我們承諾完全切換到 no-GIL 構建之前,我們需要看到社區對它的支持,” Wouters說。“我們不能只是改變預設值,然後期望社區找出他們需要做些什麼來支持它”

Python 社區在從 Python 2 過渡到 Python 3 的過程中經歷了巨大的成長痛苦,因此任何像移除 GIL 這樣的重大更改都必須完全向後相容

正如 Wouters 所說,“我們不希望再出現 Python 3 的情況。”

不過在危險和挑戰之外,還有一個巨大的回報——Python 最終支持了程式員在 21 世紀所期望的並行性


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 隨著大屏幕技術的發展,大屏數字滾動效果在各種應用場景中越來越常見,例如數字展示、統計數據展示等。Vue3 作為一種流行的前端開發框架,提供了強大的工具和便捷的開發方式,非常適合實現大屏數字滾動效果。 本篇博文將介紹如何使用 Vue3 來實現大屏數字滾動效果。在實現過程中,我們可以使用調試工具進行測... ...
  • 通過編碼實戰瞭解quarkus攔截器的另一個高級特性:禁用類級別攔截器,這樣可以避免類級別和方法級別攔截器的疊加衝突 ...
  • # docker-compose ## compose安裝 ### Compose 簡介 Compose 是用於定義和運行多容器 Docker 應用程式的工具。通過 Compose,您可以使用 YML 文件來配置應用程式需要的所有服務。然後,使用一個命令,就可以從 YML 文件配置中創建並啟動所有服 ...
  • Spring可能成為您的所有企業應用程式的一站式商店。但是,Spring是模塊化的,允許您挑選適用於您的模塊,而無需引入其他模塊。下麵的部分提供了Spring Framework中所有可用模塊的詳細信息。 Spring Framework提供了大約20個模塊,可以根據應用程式要求使用。 ## 核心容 ...
  • 由於垃圾收集演算法的實現涉及大量的程式細節,而且各個平臺的虛擬機操作記憶體的方法又各不相同,因此本節不打算過多地討論演算法的實現,只是介紹幾種演算法的思想及其發展過程。 垃圾收集演算法概要 1、 標記-清除演算法 標記-清除演算法最基礎的收集演算法是“標記-清除”(Mark-Sweep)演算法,演算法分為“標記”和“清 ...
  • **** # 1.內容 | | 解釋 | | | | | // 內容 | 單行註釋 | | /* 內容 */ | 多行註釋 | | /*** 內容 */ | 文檔註釋 | # 2.多行註釋 與 文檔註釋的區別 多行註釋: ![img](https://img2023.cnblogs.com/blog ...
  • **原文鏈接:** [如何實現計數器限流?](https://mp.weixin.qq.com/s/CTemkZ2aKPCPTuQiDJri0Q) 上一篇文章 [go-zero 是如何做路由管理的?](https://mp.weixin.qq.com/s/uTJ1En-BXiLvH45xx0eFsA ...
  • ## 教程簡介 Mahout 是 Apache Software Foundation(ASF) 旗下的一個開源項目,提供一些可擴展的機器學習領域經典演算法的實現,旨在幫助開發人員更加方便快捷地創建智能應用程式。Mahout包含許多實現,包括聚類、分類、推薦過濾、頻繁子項挖掘。此外,通過使用 Apac ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...