Python並行簡介


在本章中,我們將理解Python中的並行概念,並了解執行緒和進程的區別。

什麼是並行?

簡而言之,並行是指同時發生兩個或多個事件。 並行是一種自然現象,因為許多事件在任何給定的時間同時發生。

就程式設計而言,並行是兩個任務在執行過程中重疊的時候。 通過並行程式設計,我們的應用程式和軟體系統的效能可以得到提高,因為我們可以同時處理請求,而不是等待前一個完成再處理下一個。

並行性的歷史回顧

以下幾點將給我們簡要的並行歷史回顧 -

鐵路概念
並行性與鐵路概念密切相關。 有了鐵路,就需要在同一條鐵路系統上處理多列火車,以便每列火車都能安全到達目的地。

平行計算在學術界
對電腦科學並行性的興趣始於1965年由Edsger W. Dijkstra發表的研究論文。在本文中,他確定並解決了互斥問題,即併行控制的性質。

高階並行基元
最近,由於引入了高階並行基元,程式員正在改進併行解決方案。

改進了程式設計語言的並行性
Google的Golang,Rust和Python等程式設計語言在幫助我們獲得更好的並行解決方案的領域取得了令人難以置信的發展。

什麼是執行緒和多執行緒?

執行緒是可以在作業系統中執行的最小執行單元。 它本身不是一個程式,而是在程式中執行。 換句話說,執行緒並不相互獨立。 每個執行緒與其他執行緒共用程式碼段,資料段等。 他們也被稱為輕量級流程。

一個執行緒由以下元件組成 -

  • 程式計數器由一個可執行指令的地址組成
  • 暫存器組
  • 唯一的ID

多執行緒,在另一方面,是CPU的通過同時執行多個執行緒管理使用作業系統的能力。 多執行緒的主要思想是通過將進程分成多個執行緒來實現並行性。 以下範例的幫助理解多執行緒的概念。

範例
假設我們正在執行一個特殊的過程,在這個過程中我們開啟MS Word來輸入內容。 一個執行緒將被分配以開啟MS Word,另一個執行緒將需要在其中輸入內容。 而現在,如果要編輯現有的文件內容,那麼將需要另一個執行緒來執行編輯任務等等。

什麼是進程和多進程?

進程被定義為一個實體,它代表了系統中要實施的基本工作單元。 簡而言之,我們將計算機程式編寫成文字檔案,當我們執行這個程式時,它就成為執行程式中提到的所有任務的過程。 在進程生命週期中,它經歷了不同的階段 - 開始,準備,執行,等待和終止。

下圖顯示了一個過程的不同階段 -

一個進程只能有一個執行緒,稱為主執行緒,或者多執行緒擁有自己的一組暫存器,程式計數器和堆疊。 以下圖表顯示了它們的區別 -

另一方面,多進程是在一個計算機系統內使用兩個或多個CPU單元。 我們的主要目標是充分利用我們的硬體。 為了實現這一點,我們需要利用我們的計算機系統中可用的全部CPU核心。 多多進程是最好的方法。

Python是一種最流行的程式設計語言。 以下是一些適合併行應用的原因 -

語法糖
語法糖是一種程式設計語言中的語法,旨在使事情更容易閱讀或表達。 它使語言「更甜」供人類使用:事物可以更清晰,更簡潔地表達,或以偏好為基礎的另一種風格表達。 Python帶有Magic方法,可以將其定義為對物件起作用。 這些Magic方法被用作語法糖,並繫結到更容易理解的關鍵字。

社群龐大
Python語言在AI,機器學習,深度學習和定量分析領域的資料科學家和數學家之間見證了大量採用率。

並行程式設計的API
Python 2和3有大量專用於併行/並行程式設計的API。 其中最受歡迎的是:threadingmultiprocessingasynciogeventgreenlets等。

Python在實現並行應用程式中的局限性

Python對併行應用程式有一個限制。 這種限制稱為GIL(全域性直譯器鎖),它存在於Python中。 GIL從來不允許我們利用CPU的多個核心,因此可以說Python中沒有真正的執行緒。 我們可以理解GIL的概念如下 -

GIL(全域性直譯器鎖)
這是Python世界中最具爭議的話題之一。 在CPython中,GIL是互斥鎖 - 互斥鎖,它使執行緒安全。 換句話說,我們可以說GIL阻止了多個執行緒並行執行Python程式碼。 鎖一次只能由一個執行緒儲存,如果想執行一個執行緒,那麼它必須先獲取鎖。下面的圖表將幫助您了解GIL的工作。

但是,Python中有一些庫和實現,如:Numpy,Jpython和IronPytbhon。 這些庫與GIL沒有任何互動。