鍍金池/ 教程/ Python/ Python并發(fā)簡(jiǎn)介
事件驅(qū)動(dòng)程序
反應(yīng)式編程
進(jìn)程池
線程
線程池
Python并發(fā)簡(jiǎn)介
并發(fā)vs并行
同步線程
調(diào)試線程應(yīng)用程序
進(jìn)程間通信
線程通信
Python并發(fā)編程教程
測(cè)試線程應(yīng)用程序
基準(zhǔn)和性能分析
系統(tǒng)和內(nèi)存架構(gòu)
線程的實(shí)現(xiàn)
多進(jìn)程

Python并發(fā)簡(jiǎn)介

在本章中,我們將理解Python中的并發(fā)概念,并了解線程和進(jìn)程的區(qū)別。

什么是并發(fā)?

簡(jiǎn)而言之,并發(fā)是指同時(shí)發(fā)生兩個(gè)或多個(gè)事件。 并發(fā)是一種自然現(xiàn)象,因?yàn)樵S多事件在任何給定的時(shí)間同時(shí)發(fā)生。

就編程而言,并發(fā)是兩個(gè)任務(wù)在執(zhí)行過(guò)程中重疊的時(shí)候。 通過(guò)并發(fā)編程,我們的應(yīng)用程序和軟件系統(tǒng)的性能可以得到提高,因?yàn)槲覀兛梢酝瑫r(shí)處理請(qǐng)求,而不是等待前一個(gè)完成再處理下一個(gè)。

并發(fā)性的歷史回顧

以下幾點(diǎn)將給我們簡(jiǎn)要的并發(fā)歷史回顧 -

鐵路概念
并發(fā)性與鐵路概念密切相關(guān)。 有了鐵路,就需要在同一條鐵路系統(tǒng)上處理多列火車(chē),以便每列火車(chē)都能安全到達(dá)目的地。

并行計(jì)算在學(xué)術(shù)界
對(duì)計(jì)算機(jī)科學(xué)并發(fā)性的興趣始于1965年由Edsger W. Dijkstra發(fā)表的研究論文。在本文中,他確定并解決了互斥問(wèn)題,即并發(fā)控制的性質(zhì)。

高級(jí)并發(fā)基元
最近,由于引入了高級(jí)并發(fā)基元,程序員正在改進(jìn)并發(fā)解決方案。

改進(jìn)了編程語(yǔ)言的并發(fā)性
Google的Golang,Rust和Python等編程語(yǔ)言在幫助我們獲得更好的并發(fā)解決方案的領(lǐng)域取得了令人難以置信的發(fā)展。

什么是線程和多線程?

線程是可以在操作系統(tǒng)中執(zhí)行的最小執(zhí)行單元。 它本身不是一個(gè)程序,而是在程序中運(yùn)行。 換句話(huà)說(shuō),線程并不相互獨(dú)立。 每個(gè)線程與其他線程共享代碼段,數(shù)據(jù)段等。 他們也被稱(chēng)為輕量級(jí)流程。

一個(gè)線程由以下組件組成 -

  • 程序計(jì)數(shù)器由一個(gè)可執(zhí)行指令的地址組成
  • 寄存器組
  • 唯一的ID

多線程,在另一方面,是CPU的通過(guò)同時(shí)執(zhí)行多個(gè)線程管理使用操作系統(tǒng)的能力。 多線程的主要思想是通過(guò)將進(jìn)程分成多個(gè)線程來(lái)實(shí)現(xiàn)并行性。 以下示例的幫助理解多線程的概念。

示例
假設(shè)我們正在運(yùn)行一個(gè)特殊的過(guò)程,在這個(gè)過(guò)程中我們打開(kāi)MS Word來(lái)輸入內(nèi)容。 一個(gè)線程將被分配以打開(kāi)MS Word,另一個(gè)線程將需要在其中輸入內(nèi)容。 而現(xiàn)在,如果要編輯現(xiàn)有的文檔內(nèi)容,那么將需要另一個(gè)線程來(lái)執(zhí)行編輯任務(wù)等等。

什么是進(jìn)程和多進(jìn)程?

進(jìn)程被定義為一個(gè)實(shí)體,它代表了系統(tǒng)中要實(shí)施的基本工作單元。 簡(jiǎn)而言之,我們將計(jì)算機(jī)程序編寫(xiě)成文本文件,當(dāng)我們執(zhí)行這個(gè)程序時(shí),它就成為執(zhí)行程序中提到的所有任務(wù)的過(guò)程。 在進(jìn)程生命周期中,它經(jīng)歷了不同的階段 - 開(kāi)始,準(zhǔn)備,運(yùn)行,等待和終止。

下圖顯示了一個(gè)過(guò)程的不同階段 -

一個(gè)進(jìn)程只能有一個(gè)線程,稱(chēng)為主線程,或者多線程擁有自己的一組寄存器,程序計(jì)數(shù)器和堆棧。 以下圖表顯示了它們的區(qū)別 -

另一方面,多進(jìn)程是在一個(gè)計(jì)算機(jī)系統(tǒng)內(nèi)使用兩個(gè)或多個(gè)CPU單元。 我們的主要目標(biāo)是充分利用我們的硬件。 為了實(shí)現(xiàn)這一點(diǎn),我們需要利用我們的計(jì)算機(jī)系統(tǒng)中可用的全部CPU核心。 多多進(jìn)程是最好的方法。

Python是一種最流行的編程語(yǔ)言。 以下是一些適合并發(fā)應(yīng)用的原因 -

語(yǔ)法糖
語(yǔ)法糖是一種編程語(yǔ)言中的語(yǔ)法,旨在使事情更容易閱讀或表達(dá)。 它使語(yǔ)言“更甜”供人類(lèi)使用:事物可以更清晰,更簡(jiǎn)潔地表達(dá),或以偏好為基礎(chǔ)的另一種風(fēng)格表達(dá)。 Python帶有Magic方法,可以將其定義為對(duì)對(duì)象起作用。 這些Magic方法被用作語(yǔ)法糖,并綁定到更容易理解的關(guān)鍵字。

社區(qū)龐大
Python語(yǔ)言在AI,機(jī)器學(xué)習(xí),深度學(xué)習(xí)和定量分析領(lǐng)域的數(shù)據(jù)科學(xué)家和數(shù)學(xué)家之間見(jiàn)證了大量采用率。

并發(fā)編程的API
Python 2和3有大量專(zhuān)用于并行/并發(fā)編程的API。 其中最受歡迎的是:threading,multiprocessingasyncio,geventgreenlets等。

Python在實(shí)現(xiàn)并發(fā)應(yīng)用程序中的局限性

Python對(duì)并發(fā)應(yīng)用程序有一個(gè)限制。 這種限制稱(chēng)為GIL(全局解釋器鎖),它存在于Python中。 GIL從來(lái)不允許我們利用CPU的多個(gè)內(nèi)核,因此可以說(shuō)Python中沒(méi)有真正的線程。 我們可以理解GIL的概念如下 -

GIL(全局解釋器鎖)
這是Python世界中最具爭(zhēng)議的話(huà)題之一。 在CPython中,GIL是互斥鎖 - 互斥鎖,它使線程安全。 換句話(huà)說(shuō),我們可以說(shuō)GIL阻止了多個(gè)線程并行執(zhí)行Python代碼。 鎖一次只能由一個(gè)線程保存,如果想執(zhí)行一個(gè)線程,那么它必須先獲取鎖。下面的圖表將幫助您了解GIL的工作。

但是,Python中有一些庫(kù)和實(shí)現(xiàn),如:Numpy,Jpython和IronPytbhon。 這些庫(kù)與GIL沒(méi)有任何交互。