系統學習Python——并發模型和異步編程:進程、線程和GIL

分類目錄:《系統學習Python》總目錄


在文章《并發模型和異步編程:基礎知識》我們簡單介紹了Python中的進程、線程和協程。本文就著重介紹Python中的進程、線程和GIL的關系。

Python解釋器的每個實例都是一個進程。使用multiprocessingconcurrent.futures庫可以啟動額外的Python進程。Python的subprocess庫用于啟動運行外部程序(不管使用何種語言編寫)的進程。而Python解釋器僅使用一個線程運行用戶的程序和內存垃圾回收程序。使用threadingconcurrent.futures庫可以啟動額外的Python線程。對對象引用計數和解釋器其他內部狀態的訪問受一個鎖的控制,這個鎖就是全局解釋器鎖(Global Interpreter Lock,GIL)。任意時間點上只有一個Python線程可以持有GIL。這意味著,任意時間點上只有一個線程能執行Python代碼,與CPU核數量無關。為了防止一個Python線程無限期持有GIL,Python的字節碼解釋器默認每5毫秒暫停當前Python線程,釋放GIL。被暫停的線程可以再次嘗試獲得GIL,但是如果有其他線程等待,那么操作系統調度程序可能會從中挑選一個線程開展工作。我們編寫的Python代碼無法控制GIL。但是,耗時的任務可由內置函數或C語言(以及其他能在Python/C API層級接合的語言)擴展釋放GIL。Python標準庫中發起系統調用的函數均可釋放GIL。這包括所有執行磁盤I/O、網絡I/O的函數,以及time.sleep()NumPy/SciPy庫中很多CPU密集型函數,以及zlibbz2模塊中執行壓縮和解壓操作的函數,也都釋放GIL。在Python/C API層級集成的擴展也可以啟動不受GIL影響的非Python線程。這些不受GIL影響的線程無法更改Python對象,但是可以讀取或寫入內存中支持緩沖協議的底層對象,例如bytearrayarray.arrayNumPy數組。

GIL對使用Python線程進行網絡編程的影響相對較小,因為I/O函數釋放GIL,而且與內存讀寫相比,網絡讀寫的延遲始終很高。各個單獨的線程無論如何都要花費大量時間等待,所以線程可以交錯執行,對整體吞吐量不會產生重大影響。正如David Beazley所言:?“Python線程非常擅長什么都不做。?對GIL的爭用會降低計算密集型Python線程的速度。對于這類任務,在單線程中依序執行的代碼更簡單,速度也更快。若想在多核上運行CPU密集型Python代碼,必須使用多個Python進程。threading模塊的文檔對此做了很好的概括。

由于CPython有GIL,因此同一時間只有一個線程能執行Python代碼(盡管有些旨在提升性能的庫可以克服這個限制)?。如果我們希望應用程序充分地利用多核設備的計算資源,那么建議使用multiprocessingconcurrent.futures.ProcessPoolExecutor。然而,如果我們想同時運行多個I/O密集型任務,那么線程仍是最合適的模型。前一段開頭指出那是“CPython實現細節”?,因為GIL不是Python語言規定的機制。Jython和IronPython就沒有GIL。可惜,二者落后較多,還停留在Python2.7。高性能的PyPy解釋器的2.7和3.7版本也有GIL。

本文沒有提到協程,因為默認情況下,協程共用同一個Python線程,而且受異步框架提供的事件循環監管,所以不受GIL影響。在異步程序中也可以使用多個線程,但是最佳實踐是在同一個線程中運行事件循環和所有協程,其他線程負責執行特定的任務。

參考文獻:
[1] Mark Lutz. Python學習手冊[M]. 機械工業出版社, 2018.
[2] 盧西亞諾·拉馬略.流暢的Python 第2版(全2冊) 編程語言[M].人民郵電出版社,2023.

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

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

相關文章

【playwright篇】教程(十七)[html元素知識]

1 html中,button元素中的aria-describedby"tooltip-r1k"屬性,主要用來做什么?在 HTML 中,button 元素中的 aria-describedby"tooltip-r1k" 屬性主要用于提升網頁的可訪問性(Accessibility&#xf…

Python: 正則表達式

正則表達式是處理文本數據的強大工具,Python通過re模塊提供了完整的正則表達式功能。本文將詳細介紹Python正則表達式的使用方法,包括基礎語法、高級技巧和re模塊API的詳細解析。一、正則表達式基礎1.1 什么是正則表達式正則表達式(Regular Expression)是…

pytest合并allure報告解決方案

背景 在執行自動化測試的過程中,為了實現自動化的高通過率,可能會反復的重試,直至大多數甚至全部用例執行通過,以此來需要人為分析的用例量,減少人力投入,提高執行效率; 在用例少或者資源消耗小…

Pr插件圖文安裝教程

Pr插件圖文安裝教程 Adobe Premiere Pro,簡稱Pr,是由Adobe公司開發的一款視頻編輯軟件。Adobe Premiere有較好的兼容性,且可以與Adobe公司推出的其他軟件相互協作。這款軟件廣泛應用于廣告制作和電視節目制作中,是視頻編輯愛好者…

[netty5: HttpObjectEncoder HttpObjectDecoder]-源碼解析

在閱讀該篇文章之前,推薦先閱讀以下內容: [netty5: HttpObject]-源碼解析[netty5: MessageToMessageCodec & MessageToMessageEncoder & MessageToMessageDecoder]-源碼分析[netty5: ByteToMessageCodec & MessageToByteEncoder & Byte…

uniapp的navigator跳轉功能

接下來&#xff0c;我將圍繞一個常見的電商小程序來構建一系列連貫的使用場景。在這個過程中&#xff0c;我們將把 <navigator> 組件的所有關鍵屬性和方法都串聯起來&#xff0c;并詳細解釋它們在每個環節所扮演的角色和作用。 核心場景&#xff1a;構建一個電商小程序的…

v-for的用法及案例

目錄 一.v-for的用法 1.舉例1 2.舉例2 二.購物車案例 1.代碼 2.存在的問題&#xff1a;復選框錯位 3.解決方案&#xff1a; 賦值給key屬性一個唯一的值 一.v-for的用法 1.舉例1 <template><view><view v-for"(item,index) in 10" :key"…

BigQuery對象引用(ObjectRef)全面指南:一站式整合結構化與非結構化多模態數據分析

引言 企業需要同時管理有組織表格中的結構化數據&#xff0c;以及日益增長的非結構化數據&#xff08;如圖片、音頻和文檔&#xff09;。傳統上&#xff0c;聯合分析這些多樣化數據類型非常復雜&#xff0c;通常需要使用不同的工具。非結構化媒體通常需要導出到專門的服務進行…

【開源品鑒】FRP源碼閱讀

frp 是一款高性能的反向代理應用&#xff0c;專注于內網穿透&#xff0c;支持多種協議和 P2P 通信功能&#xff0c;目前在 GitHub 上已有 80k 的 star。本文將深入探討其源碼&#xff0c;揭示其背后的實現原理。1. 前言 frp 是一款高性能的反向代理應用&#xff0c;專注于內網…

day048-系統負載高排查流程與前后端分離項目

文章目錄 0. 老男孩思想1. 系統負載高排查流程1.1 進程/線程相關命令1.1.1 jps1.1.2 jstack1.1.3 jmap1.1.4 top -Hp pid 1.2 排查流程圖 2. 前后端分離項目2.1 項目說明2.2 負載均衡2.3 數據庫配置2.3.1 安裝數據庫服務2.3.2 配置數據庫環境 2.4 后端配置2.5 四層負載均衡配置…

Spring Boot 牽手EasyExcel:解鎖高效數據處理姿勢

引言 在日常的 Java 開發中&#xff0c;處理 Excel 文件是一個極為常見的需求。無論是數據的導入導出&#xff0c;還是報表的生成&#xff0c;Excel 都扮演著重要的角色。例如&#xff0c;在企業的財務管理系統中&#xff0c;需要將每月的財務數據導出為 Excel 報表&#xff0…

【ARM AMBA AXI 入門 21 -- AXI partial 訪問和 narrow 訪問的區別】

文章目錄 Overview一、定義區別二、AXI 信號層面對比三、舉例說明示例一:Partial Access示例二:Narrow Access四、硬件/系統處理角度五、AXI 總線接口信號舉例對比Partial Write 事務:Narrow Write 事務(32-bit Master on 64-bit Bus):六、總結對比表七,軟件判斷判斷 Pa…

使用Ideal創建一個spring boot的helloWorld項目

說明&#xff1a;本篇將介紹如何使用Ideal2024.2.1去創建一個spring boot的helloWorld項目&#xff0c;本篇將包含創建的詳細步驟以及spring boot項目的目錄結構說明&#xff0c;創建過程中的選項說明等。詳細步驟如下&#xff1a;第一步&#xff1a;點擊文件——新建——項目&…

國內Ubuntu訪問不了github等外網

各位小伙伴們&#xff0c;大家好呀。 大家是不是經常遇到訪問不了外網的情況呀。 在Ubuntu中可以這樣做。 訪問這個網站網站測速-Ping檢測-Trace查詢-Dig查詢-路由跟蹤查詢-tools.ipip.net&#xff0c; 對于github.com&#xff0c;在這個網站輸入github.com&#xff0c;會返…

PDF轉換工具,即開即用

在辦公室里&#xff0c;這句話被反復驗證。每天面對成堆的Word和Excel文件&#xff0c;將它們轉換成PDF格式是常有的事。可之前用過的工具&#xff0c;不是一次只能轉一個&#xff0c;就是操作繁瑣得讓人頭疼。記得有次趕項目&#xff0c;需要把二十多個文檔轉成PDF&#xff0c…

2. 你可以說一下 http 版本的發展過程嗎

你可以說一下 http 版本的發展過程嗎 總結&#xff1a;0.9&#xff1a;只能發送 get&#xff0c;無狀態。1.0&#xff1a;新增 post&#xff0c;請求頭&#xff0c;狀態碼&#xff0c;cookie。1.1&#xff1a;新增 put/delete/options/patch&#xff0c;keep-alive&#xff0c…

04-Linux驅動模塊的自動加載

概述 上一節&#xff0c;我們講述了Linux驅動開發的基本的模塊代碼編寫和手動執行模塊加載的操作&#xff0c; 這一節&#xff0c;我們講述嵌入式設備上使用Sysvint引導方式下如何開機自動加載模塊的步驟。感興趣的同學看下使用systemd引導方式的開啟自動加載模塊的步驟 操作…

【牛客算法】游游的整數切割

文章目錄 一、題目介紹1.1 題目鏈接1.2 題目描述1.3 輸入描述1.4 輸出描述1.5 示例二、解題思路2.1 核心算法設計2.2 性能優化關鍵2.3 算法流程圖三、解法實現3.1 解法一:基礎遍歷法3.1.1 初級版本分析3.2 解法二:奇偶預統計法(推薦)3.2.1 優化版本分析四、總結與拓展4.1 關…

筆記本電腦忽亮忽暗問題

關于筆記本電腦忽亮忽暗的問題這個問題困擾了我大半年&#xff0c;最后忽然找到解決方法了---主要的話有三種可能性1.關閉顯示器自動調亮的功能2.關閉節能模式自動調亮功能3.調整顯卡的功率&#xff0c;關閉自動調亮功能一開始一直都是嘗試的第一種方法&#xff0c;沒解決。。。…

Qt的頂部工具欄在多個界面使用

Qt的工具欄在多個界面使用1、前言2、創建一個工具欄類2.1 新建一個工具欄類3、提升工具欄類3.1登錄界面添加工具欄3.2 創建工具欄對象4、總結1、前言 今天遇到了個問題&#xff0c;頂部的工具欄&#xff0c;像軟鍵盤&#xff0c;時間顯示和退出按鈕那些&#xff0c;想在多個界…