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。 其中最受歡迎的是:threading
,multiprocessing
,asyncio
,gevent
和greenlets
等。
Python在實現併發應用程序中的侷限性
Python對併發應用程序有一個限制。 這種限制稱爲GIL(全局解釋器鎖),它存在於Python中。 GIL從來不允許我們利用CPU的多個內核,因此可以說Python中沒有真正的線程。 我們可以理解GIL的概念如下 -
GIL(全局解釋器鎖)
這是Python世界中最具爭議的話題之一。 在CPython中,GIL是互斥鎖 - 互斥鎖,它使線程安全。 換句話說,我們可以說GIL阻止了多個線程並行執行Python代碼。 鎖一次只能由一個線程保存,如果想執行一個線程,那麼它必須先獲取鎖。下面的圖表將幫助您瞭解GIL的工作。
但是,Python中有一些庫和實現,如:Numpy,Jpython和IronPytbhon。 這些庫與GIL沒有任何交互。