線程、進程、協(xié)程

線程

什么是線程

線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執(zhí)行流的最小單元。一個標準的線程由線程ID,當前指令[指針])(PC),[寄存器])集合和[堆棧組 成。另外,線程是進程中的一個實體,是被系統(tǒng)獨立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個 進程的其它線程共享進程所擁有的全部資源。一個線程可以創(chuàng)建和撤消另一個線程,同一進程中的多個線程之間可以并發(fā)執(zhí)行。由于線程之間的相互制約,致使線程 在運行中呈現(xiàn)出間斷性。線程也有[就緒]、[阻塞]和[運行]三種基本狀態(tài)。就緒狀態(tài)是指線程具備運行的所有條件,邏輯上可以運行,在等待處理機;運行狀態(tài)是指線程占有處理機正在運行;阻塞狀態(tài)是指線程在等待一個事件(如某個信號量),邏輯上不可執(zhí)行。每一個程序都至少有一個線程,若程序只有一個線程,那就是程序本身。
線程是程序中一個單一的順序控制流程。進程內(nèi)一個相對獨立的、可調(diào)度的執(zhí)行單元,是系統(tǒng)獨立調(diào)度和分派CPU的基本單位指[運行]中的程序的調(diào)度單位。在單個程序中同時運行多個線程完成不同的工作,稱為[多線程]。
  線程是程序中一個單一的順序控制流程。進程內(nèi)一個相對獨立的、可調(diào)度的執(zhí)行單元,是系統(tǒng)獨立調(diào)度和分派CPU的基本單位指[運行]中的程序的調(diào)度單位。在單個程序中同時運行多個線程完成不同的工作,稱為[多線程]。

python的thread模塊是比較底層的模塊,python的threading模塊是對thread做了一些包裝的,可以更加方便的被使用

#coding=utf-8
import time

def saySorry():
  for i in range(5):
print("親愛的,我錯了,我能吃飯了嗎?")
time.sleep(1)

def do():
for i in range(5):
print("親愛的,我錯了,我給你按摩")
time.sleep(1)

if __name__ == "__main__":
saySorry()
saydo()

多線程

#coding=utf-8
import threading
import time

def saySorry():
  for i in range(5):
print("親愛的,我錯了,我能吃飯了嗎?")
time.sleep(1)

def do():
for i in range(5):
print("親愛的,我錯了,我給你按摩")
time.sleep(1)

if __name__ == "__main__":
td1 = threading.Thread(target=saySorry)
td1.start() #啟動線程,即讓線程開始執(zhí)行
td2 = threading.Thread(target=saySorry)
td2.start() #啟動線程,即讓線程開始執(zhí)行

threading.Thread參數(shù)介紹

target:線程執(zhí)行的函數(shù)
name:線程名稱
args:執(zhí)行函數(shù)中需要傳遞的參數(shù),元組類型 另外:注意daemon參數(shù)
如果某個子線程的daemon屬性為False,主線程結(jié)束時會檢測該子線程是否結(jié)束,如果該子線程還在運行,則主線程會等待它完成后再退出;
如果某個子線程的daemon屬性為True,主線程運行結(jié)束時不對這個子線程進行檢查而直接退出,同時所有daemon值為True的子線程將隨主線程一起結(jié)束,而不論是否運行完成。
屬性daemon的值默認為False,如果需要修改,必須在調(diào)用start()方法啟動線程之前進行設置

可以明顯看出使用了多線程并發(fā)的操作,花費時間要短很多 2.當調(diào)用start()時,才會真正的創(chuàng)建線程,并且開始執(zhí)行

進程

什么是進程

)是計算機中的程序關(guān)于某數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度的基本單位,是[操作系統(tǒng)]結(jié)構(gòu)的基礎(chǔ)。在早期面向進程設計的計算機結(jié)構(gòu)中,進程是程序的基本執(zhí)行實體;在當代面向線程設計的計算機結(jié)構(gòu)中,進程是線程的容器。程序是指令、數(shù)據(jù)及其組織形式的描述,進程是程序的實體。
  進程是一個具有獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運行活動。它可以申請和擁有系統(tǒng)資源,是一個動態(tài)的概念,是一個活動的實體。它不只是程序的[代碼],還包括當前的活動,通過[程序計數(shù)器]的值和處理[寄存器]的內(nèi)容來表示。
  進程的概念主要有兩點:第一,進程是一個實體。每一個進程都有它自己的地址空間,一般情況下,包括[文本]區(qū)域、數(shù)據(jù)區(qū)域(data region)和[堆棧](stack region)。文本區(qū)域存儲處理器執(zhí)行的代碼;數(shù)據(jù)區(qū)域存儲變量和進程執(zhí)行期間使用的動態(tài)分配的內(nèi)存;堆棧區(qū)域存儲著活動過程調(diào)用的指令和本地變量。第二,進程是一個“執(zhí)行中的程序”。程序是一個沒有生命的實體,只有[處理]器賦予程序生命時(操作系統(tǒng)執(zhí)行之),它才能成為一個活動的實體,我們稱其為[進程]。

進程的狀態(tài)

工作中,任務數(shù)往往大于cpu的核數(shù),即一定有一些任務正在執(zhí)行,而另外一些任務在等待cpu進行執(zhí)行,因此導致了有了不同的狀態(tài)
就緒態(tài):運行的條件都已經(jīng)慢去,正在等在cpu執(zhí)行
執(zhí)行態(tài):cpu正在執(zhí)行其功能
等待態(tài):等待某些條件滿足,例如一個程序sleep了,此時就處于等待態(tài)
進程的創(chuàng)建-multiprocessing

進程池

當需要創(chuàng)建的子進程數(shù)量不多時,可以直接利用multiprocessing中的Process動態(tài)成生多個進程,但如果是上百甚至上千個目標,手動的去創(chuàng)建進程的工作量巨大,此時就可以用到multiprocessing模塊提供的Pool方法。
初始化Pool時,可以指定一個最大進程數(shù),當有新的請求提交到Pool中時,如果池還沒有滿,那么就會創(chuàng)建一個新的進程用來執(zhí)行該請求;但如果池中的進程數(shù)已經(jīng)達到指定的最大值,那么該請求就會等待,直到池中有進程結(jié)束,才會用之前的進程來執(zhí)行新的任務,請看下面的實例:

進程與線程的對比:

一個程序至少有一個進程,一個進程至少有一個線程.
線程的劃分尺度小于進程(資源比進程少),使得多線程程序的并發(fā)性高
進程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運行效率
線線程不能夠獨立執(zhí)行,必須依存在進程中

優(yōu)缺點

線程和進程在使用上各有優(yōu)缺點:線程執(zhí)行開銷小,但不利于資源的管理和保護;而進程正相反。

協(xié)程、

一個程序可以包含多個協(xié)程,可以對比與一個進程包含多個線程,因而下面我們來比較協(xié)程和線程。我們知道多個線程相對獨立,有自己的上下文,切換受系統(tǒng)控制;而協(xié)程也相對獨立,有自己的上下文,但是其切換由自己控制,由當前協(xié)程切換到其他協(xié)程由當前協(xié)程來控制。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容