python 并發(fā)簡介
在本章中,我們將了解python中的并發(fā)概念,并了解不同的線程和進程。
什么是并發(fā)?
簡單來說,并發(fā)性是同時發(fā)生的兩個或多個事件。并發(fā)是一種自然現(xiàn)象,因為許多事件在任何給定時間同時發(fā)生。
在編程方面,并發(fā)性是指兩個任務在執(zhí)行時重疊。通過并發(fā)編程,我們的應用程序和軟件系統(tǒng)的性能可以得到改善,因為我們可以同時處理請求而不是等待前一個請求完成。
并發(fā)的歷史回顧
以下幾點將為我們提供并發(fā)的簡要歷史回顧 -
從鐵路的概念
并發(fā)性與鐵路概念密切相關。對于鐵路,需要在同一鐵路系統(tǒng)上處理多列火車,以便每輛火車都能安全到達目的地。
學術界的并行計算
計算機科學并發(fā)的興趣始于edsger w. dijkstra于1965年發(fā)表的研究論文。在本文中,他發(fā)現(xiàn)并解決了互斥問題,即并發(fā)控制的特性。
高級并發(fā)原語
最近,由于引入了高級并發(fā)原語,程序員正在改進并發(fā)解決方案。
使用編程語言改進了并發(fā)性
google的golang,rust和python等編程語言在幫助我們獲得更好的并發(fā)解決方案的領域取得了令人難以置信的發(fā)展。
什么是線程和多線程?
線程 是可以在操作系統(tǒng)中執(zhí)行的最小執(zhí)行單元。它本身不是一個程序,而是在一個程序中運行。換句話說,線程不是彼此獨立的。每個線程與其他線程共享代碼段,數(shù)據(jù)段等。它們也被稱為輕量級過程。
線程由以下組件組成 -
- 程序計數(shù)器,包含下一個可執(zhí)行指令的地址
- 堆
- 寄存器集
- 一唯一的id
多線程 是cpu通過并發(fā)執(zhí)行多個線程來管理操作系統(tǒng)使用的能力。多線程的主要思想是通過將進程劃分為多個線程來實現(xiàn)并行性。在以下示例的幫助下,可以理解多線程的概念。
例
假設我們正在運行一個特定的過程,其中我們打開ms word以在其中鍵入內容。將分配一個線程來打開ms word,并且需要另一個線程在其中鍵入內容?,F(xiàn)在,如果我們想編輯現(xiàn)有的,那么另一個線程將需要執(zhí)行編輯任務,依此類推。
什么是流程和多處理?
過程 被定義為一個實體,它代表工作的基本單元,在該系統(tǒng)中實現(xiàn)。簡單來說,我們將計算機程序寫入文本文件中,當我們執(zhí)行該程序時,它將成為執(zhí)行程序中提到的所有任務的過程。在過程生命周期中,它經(jīng)過不同的階段 開始,準備,運行,等待和終止。
下圖顯示了流程的不同階段 -
一個進程只能有一個線程,稱為主線程,或者多個線程有自己的寄存器,程序計數(shù)器和堆棧。下圖將向我們展示差異 -
多處理 是在單個計算機系統(tǒng)中使用兩個或更多個cpu單元。我們的主要目標是充分發(fā)揮硬件的潛力。為此,我們需要利用計算機系統(tǒng)中可用的全部cpu內核。多處理是這樣做的最佳方法。
python是最流行的編程語言之一。以下是使其適用于并發(fā)應用程序的一些原因
句法糖
語法糖是編程語言中的語法,旨在使事物更易于閱讀或表達。它使語言“更甜”供人類使用:事物可以更清晰,更簡潔地表達,或者根據(jù)偏好以另一種方式表達。python附帶了magic方法,可以定義它們作用于對象。這些magic方法被用作語法糖并綁定到更易于理解的關鍵字。
大社區(qū)
python語言已經(jīng)見證了數(shù)據(jù)科學家和數(shù)學家的大量采用率,他們在ai,機器學習,深度學習和定量分析領域工作。
用于并發(fā)編程的有用api
python 2和3擁有大量專用于并行/并發(fā)編程的api。其中最受歡迎的是 線程,并發(fā)功能,多處理,asyncio,gevent和greenlets 等。
python在實現(xiàn)并發(fā)應用程序中的局限性
python對并發(fā)應用程序有限制。這種限制在python中存在,稱為 gil(全局解釋器鎖) 。gil從不允許我們使用多個cpu內核,因此我們可以說python中沒有真正的線程。我們可以理解gil的概念如下 -
gil(全球翻譯鎖)
它是python世界中最具爭議的話題之一。在cpython中,gil是互斥鎖 - 互斥鎖,它使線程安全。換句話說,我們可以說gil阻止多個線程并行執(zhí)行python代碼。鎖一次只能由一個線程保存,如果我們想要執(zhí)行一個線程,那么它必須首先獲取鎖。下面的圖表將幫助您了解gil的工作情況。
但是,python中有一些庫和實現(xiàn),如 numpy,jpython 和 ironpytbhon。 這些庫在沒有與gil交互的情況下工作。