首頁 後端開發 Python教學 Python 中的並行與平行

Python 中的並行與平行

Jan 05, 2025 am 03:59 AM


是的,我已經停止在這裡發布,但從行銷的角度來看,最好繼續發布......我們繼續。

文本最初發佈於此處。


本文的目的是直接總結理解 Python 語言中的並行性所需的基本概念。我建議您了解該主題的最低背景知識,或將本文與其他來源的研究結合。所有參考資料均在文末。

我將涵蓋以下主題:

  • 什麼是進程?
  • 什麼是線程?
  • I/O 限制和 CPU 限制是什麼意思?
  • 什麼是 Python GIL?
  • 什麼是競爭?
  • 什麼是並行?
  • asyncio 庫
  • 線程庫
  • 多處理庫

什麼是流程?

在計算中,進程是正在運行的應用程式的實例。如果您在電腦上開啟一個應用程式(例如瀏覽器),該應用程式將與某個進程關聯。一個流程由以下部分組成:

  • 硬體上下文:儲存通用暫存器和CPU特定暫存器的內容
  • 軟體上下文:指定進程可以指派的資源
  • 位址空間:指定行程所屬的記憶體區域

以下圖片取自 Francis Machado 和 Luis Maia 的書:

Concorrência e paralelismo em Python

此資訊是執行程序所必需的。

什麼是線?

執行緒是程式的子例程,是作業系統管理的最小執行單元,也是行程的元件

假設進程的各個執行緒可以並發執行(我們很快就會理解),共享記憶體等資源。不同的進程不共享這些資源。

下圖取自維基百科:

Concorrência e paralelismo em Python

解釋上圖,我們可以得出,一個程式保存在磁碟(輔助非揮發性記憶體)上,包含多個指令,並且可以在一個或多個進程中實例化(啟動),而這些又可以具有幾個相關的線程。

I/O 限制和 CPU 限制是什麼意思?

這兩個表達在有關競爭的討論中出現很多,並且可以在葡萄牙語中與 I/O(輸入/輸出)和 CPU(中央處理單元)一起出現。

當我們談論 I/O 限制和 CPU 限制時,我們談論的是阻止操作在電腦上更快運行的限制因素,我們可以在同一程式碼庫中找到這兩種類型的操作。

CPU 密集型操作是 CPU 密集型操作,如果 CPU 更強大,運行速度會更快。換句話說,如果我們將時脈速度從 2GHz 提高到 4GHz,那麼該操作可能會運行得更快。我們在這裡討論的是執行許多計算、計算的操作;例如,如何計算 Pi。

I/O 綁定操作取決於網路速度以及輸入和輸出設備的速度。向 Web 伺服器發出請求或從磁碟讀取檔案是 I/O 綁定操作。

兩種類型的操作都可以從並發的使用中受益。

Python 的 GIL 是什麼?

GIL 代表全域解釋器鎖,旨在防止一個Python 程序同時執行多個Python 指令字節碼。要執行一個線程,必須「取得」GIL,而當一個線程持有 GIL 時,另一個線程無法同時取得它。這並不意味著我們在這種情況下不能有多個線程。

這裡我們正在考慮Python參考實作。 CPython 是 Python 的標準實現,用作該語言行為方式的參考。還有其他實現,例如 Jython 或 IronPython。 GIL 存在於 CPython 中,直到最近我們才收到 PEP(Python 增強提案)建議將 GIL 設為可選。

GIL 的想法是防止競爭條件,當多個執行緒需要同時引用一個 Python 物件時,就會出現這種情況。如果多個執行緒修改共享變量,則該變數可能會處於意外狀態。圖片取自 Matthew Fowler 的書:

Concorrência e paralelismo em Python

在上圖中,兩個執行緒試圖同時增加引用計數,由於兩個執行緒都增加了 1,所以最終結果給出了 1(每個執行緒是一列),而不是計數給出 2。

什麼是競爭?

處理多個任務時,就會發生計算競爭,而不必完全同時執行這兩個任務。 Rob Pyke 關於這個主題的著名短語:

競爭意味著同時處理很多事情。並行性是同時做很多事情。

想像一下這個假設的情況:如果你要做兩個蛋糕,你可以先預熱烤箱,同時準備第一個蛋糕的麵團。一旦烤箱達到正確的溫度,您就可以將第一個蛋糕的麵團放入烤箱,在等待蛋糕在烤箱中發酵的同時,您可以準備第二個蛋糕的麵團。競爭的想法基本上就是這樣,你不需要閒著、卡住、停止,在等待任務完成的時候,你可以做一個切換,改變任務。

在這種情況下,我們有兩種類型的多工:

  • 協作多工:在此模型中,我們在程式碼中解釋了任務可以切換的點。在Python中,這是使用事件循環(一種常見的設計模式)來實現的,僅使用一個執行緒和一個CPU核心,例如使用asyncio與async和await
  • 搶佔式多工:在此模型中,我們讓作業系統處理開關。在 Python 中,這是透過多個執行緒和一個 CPU 核心來實現的,例如使用執行緒庫

下圖有助於總結 Python 中的並發性:

Concorrência e paralelismo em Python

什麼是並行性?

並行意味著多個任務同時執行。換句話說,並行意味著並發(處理多個任務),但並發並不意味著並行(任務不一定同時並行執行)。為了讓並行性成為可能,我們需要多個 CPU 核心。

在 Python 中,並行性是透過多處理函式庫實現的,其中我們將擁有多個 Python 進程,每個進程都有自己的 GIL。此圖有助於說明 Python 中的並行性:

Concorrência e paralelismo em Python

非同步庫

在 Python 中實現並發和並行有不同的方法,我們可以使用一些函式庫來最佳化我們的程式碼,這取決於我們正在處理的操作類型,I/O 限製或 CPU 限制。 asyncio 是一個使用 async 和await 實作並發的函式庫。來自文件:

Asyncio 被用作多個非同步 Python 框架的基礎,這些框架提供高效能網路和 Web 伺服器、資料庫連接庫、分散式作業佇列等。

正如你想像的那樣,這個函式庫適合優化 I/O 密集型任務,其中有網路等待時間、寫入磁碟等。在 CPU 密集型操作中,沒有等待,我們只依賴 CPU 運算速度。

執行緒庫

Python 的執行緒庫允許我們操作多個執行緒,但是,我們仍然處理一個CPU 核心和一個Python 進程,請記住,這是作業系統執行搶佔式多工處理的一種情況我們的任務切換。該程式庫對於優化 I/O 綁定操作也更有用。

關於線程,Real Python 網站提供了一些要點:

由於作業系統控制一個任務何時停止以及另一個任務何時啟動,因此執行緒之間共享的任何資料都需要受到保護,或執行緒安全。不幸的是 requests.Session() 不是線程安全。有多種策略可以使資料存取線程安全,具體取決於資料是什麼以及您如何使用它。其中之一是使用線程安全資料結構作為Python隊列模組的Queue。

我們在這裡找到了隊列文件。

多處理庫

關於Python文件中的多處理庫:

multiprocessing 是一個支援使用類似 threading 模組的 API 產生程序的套件。多處理包提供本地和遠端並發,透過使用子進程而不是執行緒有效地繞過 GIL。這就是為什麼多處理模組允許程式設計師利用一台機器上的多個處理器

值得指出的是,在不同的CPU核心上執行多個進程並不意味著停用GIL,而是每個進程都會有自己的GIL。透過利用多個 CPU 核心,在多個可用核心之間分擔繁重的 CPU 工作負載,該程式庫更適合 CPU 限制。


來源:

福勒,馬修。 Python 與 asyncio 的並發。曼寧出版社,2022 年。

馬查多,法蘭西斯‧貝倫熱;瑪雅,路易斯‧保羅。作業系統架構:包括 SOSIM 模擬器練習和 ENADE 問題。裡約熱內盧:LTC,2013。

維基百科的線程(計算)

透過真正的 Python 並發來加速你的 Python 程式

以上是Python 中的並行與平行的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1662
14
CakePHP 教程
1418
52
Laravel 教程
1311
25
PHP教程
1261
29
C# 教程
1234
24
Python vs.C:申請和用例 Python vs.C:申請和用例 Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

Python:遊戲,Guis等 Python:遊戲,Guis等 Apr 13, 2025 am 12:14 AM

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

2小時的Python計劃:一種現實的方法 2小時的Python計劃:一種現實的方法 Apr 11, 2025 am 12:04 AM

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

您可以在2小時內學到多少python? 您可以在2小時內學到多少python? Apr 09, 2025 pm 04:33 PM

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

Python與C:學習曲線和易用性 Python與C:學習曲線和易用性 Apr 19, 2025 am 12:20 AM

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

Python和時間:充分利用您的學習時間 Python和時間:充分利用您的學習時間 Apr 14, 2025 am 12:02 AM

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python:探索其主要應用程序 Python:探索其主要應用程序 Apr 10, 2025 am 09:41 AM

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

Python:自動化,腳本和任務管理 Python:自動化,腳本和任務管理 Apr 16, 2025 am 12:14 AM

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

See all articles