溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python多線程是什么

發(fā)布時間:2020-09-24 10:15:56 來源:億速云 閱讀:134 作者:Leah 欄目:編程語言

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)Python多線程是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

幾乎所有的操作系統(tǒng)都支持同時運行多個任務(wù),一個任務(wù)通常就是一個程序,每一個運行中的程序就是一個進(jìn)程。當(dāng)一個程序運行時,內(nèi)部可能包含多個順序執(zhí)行流,每一個順序執(zhí)行流就是一個線程。

線程和進(jìn)程

幾乎所有的操作系統(tǒng)都支持進(jìn)程的概念,所有運行中的任務(wù)通常對應(yīng)一個進(jìn)程(Process)。當(dāng)一個程序進(jìn)入內(nèi)存運行時,即變成一個進(jìn)程。進(jìn)程是處于運行過程中的程序,并且具有一定的獨立功能。進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨立單位。

一般而言,進(jìn)程包含如下三個特征:

獨立性:進(jìn)程是系統(tǒng)中獨立存在的實體,它可以擁有自己的獨立的資源,每一個進(jìn)程都擁有自己的私有的地址空間。在沒有經(jīng)過進(jìn)程本身允許的情況下,一個用戶進(jìn)程不可以直接訪問其他進(jìn)程的地址空間。

動態(tài)性:進(jìn)程與程序的區(qū)別在于,程序只是一個靜態(tài)的指令集合,而進(jìn)程是一個正在系統(tǒng)中活動的指令集合。在進(jìn)程中加入了時間的概念。進(jìn)程具有自己的生命周期和各種不同的狀態(tài),在程序中是沒有這些概念的。

并發(fā)性:多個進(jìn)程可以在單個處理器上并發(fā)執(zhí)行,多個進(jìn)程之間不會互相影響。

并發(fā)(Concurrency)和并行(Parallel)是兩個概念,并行指在同一時刻有多條指令在多個處理器上同時執(zhí)行;并發(fā)才旨在同一時刻只能有一條指令執(zhí)行,但多個進(jìn)程指令被快速輪換執(zhí)行,使得在宏觀上具有多個進(jìn)程同時執(zhí)行的效果。

大部分操作系統(tǒng)都支持多進(jìn)程并發(fā)執(zhí)行,現(xiàn)代的操作系統(tǒng)幾乎都支持同時執(zhí)行多個任務(wù)。例如,程序員一邊開著開發(fā)工具在寫程序,一邊開著參考手冊備查,同時還使用電腦播放音樂……除此之外,每臺電腦運行時還有大量底層的支撐性程序在運行……這些進(jìn)程看上去像是在同時工作。

但事實的真相是,對于一個 CPU 而言,在某個時間點它只能執(zhí)行一個程序。也就是說,只能運行一個進(jìn)程,CPU 不斷地在這些進(jìn)程之間輪換執(zhí)行。那么,為什么用戶感覺不到任何中斷呢?

這是因為相對人的感覺來說,CPU 的執(zhí)行速度太快了(如果啟動的程序足夠多,則用戶依然可以感覺到程序的運行速度下降了)。所以,雖然 CPU 在多個進(jìn)程之間輪換執(zhí)行,但用戶感覺到好像有多個進(jìn)程在同時執(zhí)行。

現(xiàn)代的操作系統(tǒng)都支持多進(jìn)程的并發(fā)執(zhí)行,但在具體的實現(xiàn)細(xì)節(jié)上可能因為硬件和操作系統(tǒng)的不同而采用不同的策略。比較常用的策略有:

共用式的多任務(wù)操作策略,例如 Windows 3.1 和 Mac OS 9 操作系統(tǒng)采用這種策略;

搶占式的多任務(wù)操作策略,其效率更高,目前操作系統(tǒng)大多采用這種策略,例如 Windows NT、Windows 2000 以及 UNIX/Linux 等操作系統(tǒng)。

多線程則擴(kuò)展了多進(jìn)程的概念,使得同一個進(jìn)程可以同時并發(fā)處理多個任務(wù)。線程(Thread)也被稱作輕量級進(jìn)程(Lightweight Process),線程是進(jìn)程的執(zhí)行單元。就像進(jìn)程在操作系統(tǒng)中的地位一樣,線程在程序中是獨立的、并發(fā)的執(zhí)行流。

當(dāng)進(jìn)程被初始化后,主線程就被創(chuàng)建了。對于絕大多數(shù)的應(yīng)用程序來說,通常僅要求有一個主線程,但也可以在進(jìn)程內(nèi)創(chuàng)建多個順序執(zhí)行流,這些順序執(zhí)行流就是線程,每一個線程都是獨立的。

線程是進(jìn)程的組成部分,一個進(jìn)程可以擁有多個線程,一個線程必須有一個父進(jìn)程。線程可以擁有自己的堆棧、自己的程序計數(shù)器和自己的局部變量,但不擁有系統(tǒng)資源,它與父進(jìn)程的其他線程共享該進(jìn)程所擁有的全部資源。因為多個線程共享父進(jìn)程里的全部資源,因此編程更加方便;但必須更加小心,因為需要確保線程不會妨礙同一進(jìn)程中的其他線程。

線程可以完成一定的任務(wù),可以與其他線程共享父進(jìn)程中的共享變量及部分環(huán)境,相互之間協(xié)同未完成進(jìn)程所要完成的任務(wù)。

線程是獨立運行的,它并不知道進(jìn)程中是否還有其他線程存在。線程的運行是搶占式的,也就是說,當(dāng)前運行的線程在任何時候都可能被掛起,以便另外一個線程可以運行。

一個線程可以創(chuàng)建和撤銷另一個線程,同一個進(jìn)程中的多個線程之間可以并發(fā)運行。

從邏輯的角度來看,多線程存在于一個應(yīng)用程序中,讓一個應(yīng)用程序可以有多個執(zhí)行部分同時執(zhí)行,但操作系統(tǒng)無須將多個線程看作多個獨立的應(yīng)用,對多線程實現(xiàn)調(diào)度和管理,以及資源分配。線程的調(diào)度和管理由進(jìn)程本身負(fù)責(zé)完成。

簡而言之,一個程序運行后至少有一個進(jìn)程,在一個進(jìn)程中可以包含多個線程,但至少要包含一個主線程。

歸納起來可以這樣說,操作系統(tǒng)可以同時執(zhí)行多個任務(wù),每一個任務(wù)就是一個進(jìn)程,進(jìn)程可以同時執(zhí)行多個任務(wù),每一個任務(wù)就是一個線程。

多線程的好處

線程在程序中是獨立的、并發(fā)的執(zhí)行流。與分隔的進(jìn)程相比,進(jìn)程中線程之間的隔離程度要小,它們共享內(nèi)存、文件句柄和其他進(jìn)程應(yīng)有的狀態(tài)

因為線程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高。進(jìn)程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運行效率。

線程比進(jìn)程具有更高的性能,這是由于同一個進(jìn)程中的線程都有共性多個線程共享同一個進(jìn)程的虛擬空間。線程共享的環(huán)境包括進(jìn)程代碼段、進(jìn)程的公有數(shù)據(jù)等,利用這些共享的數(shù)據(jù),線程之間很容易實現(xiàn)通信。

操作系統(tǒng)在創(chuàng)建進(jìn)程時,必須為該進(jìn)程分配獨立的內(nèi)存空間,并分配大量的相關(guān)資源,但創(chuàng)建線程則簡單得多。因此,使用多線程來實現(xiàn)并發(fā)比使用多進(jìn)程的性能要高得多。

總結(jié)起來,使用多線程編程具有如下幾個優(yōu)點:

進(jìn)程之間不能共享內(nèi)存,但線程之間共享內(nèi)存非常容易。

操作系統(tǒng)在創(chuàng)建進(jìn)程時,需要為該進(jìn)程重新分配系統(tǒng)資源,但創(chuàng)建線程的代價則小得多。因此,使用多線程來實現(xiàn)多任務(wù)并發(fā)執(zhí)行比使用多進(jìn)程的效率高。

Python 語言內(nèi)置了多線程功能支持,而不是單純地作為底層操作系統(tǒng)的調(diào)度方式,從而簡化了 Python 的多線程編程。

在實際應(yīng)用中,多線程是非常有用的。比如一個瀏覽器必須能同時下載多張圖片;一個 Web 服務(wù)器必須能同時響應(yīng)多個用戶請求;圖形用戶界面(GUI)應(yīng)用也需要啟動單獨的線程,從主機(jī)環(huán)境中收集用戶界面事件……總之,多線程在實際編程中的應(yīng)用是非常廣泛的。

上述就是小編為大家分享的Python多線程是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI