Python 程序 執行緒 協程

2021-08-19 13:33:15 字數 2606 閱讀 8367

程序和執行緒之間的關係:

執行緒是屬於程序的,執行緒執行在程序空間內,同一程序所產生的執行緒共享同一記憶體空間,當程序退出時該程序所產生的執行緒都會被強制退出並清除。執行緒可與屬於同一程序的其它執行緒共享程序所擁有的全部資源,但是其本身基本上不擁有系統資源,只擁有一點在執行中必不可少的資訊(如程式計數器、一組暫存器和棧)。

執行緒threading模組:

import threading

import time

def worker(num):

"""thread worker function

:return:

"""time.sleep(1)

print("the num is %d" % num)

return

for i in range(20):

t = threading.thread(target=worker, args=(i,))

t.start()

threading用於提供執行緒相關的操作,執行緒是應用程式中工作的最小單元。

由於執行緒之間是進行隨機排程,並且每個執行緒可能只執行n條語句之後,cpu接著執行其他執行緒。為了保證資料的準確性,引入了鎖的概念。threading.rlock和threading.lock。rlock允許在同一執行緒中被多次acquire。而lock卻不允許這種情況。 如果使用rlock,那麼acquire和release必須成對出現,即呼叫了n次acquire,必須呼叫n次的release才能真正釋放所占用的瑣。

程序multiprocessing模組:

multiprocessing是python的多程序管理包,和threading.thread類似。

from multiprocessing import process

def func(name):

print('hello', name)

if __name__ == "__main__":

p = process(target=func,args=('zhangyanlin',))

p.start()

p.join() # 等待程序執行完畢

協程greenlet模組:

執行緒和程序的操作是由程式觸發系統介面,最後的執行者是系統;協程的操作則是程式設計師。

協程存在的意義:對於多執行緒應用,cpu通過切片的方式來切換執行緒間的執行,執行緒切換時需要耗時(儲存狀態,下次繼續)。協程,則只使用乙個執行緒,在乙個執行緒中規定某個**塊執行順序。

import greenlet

def fun1():

print("12")

gr2.switch()

print("56")

gr2.switch()

def fun2():

print("34")

gr1.switch()

print("78")

gr1 = greenlet.greenlet(fun1)

gr2 = greenlet.greenlet(fun2)

print 'go'

gr1.switch() # print: go 12 34 56 78

適用場景:

執行緒:io密集型。所謂io密集型任務,是指磁碟io、網路io佔主要的任務,計算量很小。比如請求網頁、讀寫檔案等。我們在python中可以利用sleep達到io密集型任務的目的。

協程:當程式中存在大量不需要cpu的操作時(io)

python中的程序和執行緒

python,特指cpython的實現,由於gil的存在,cpython不能有效的利用多核處理器。表現為任意時間乙個程序只有乙個執行緒在跑,而io密集型運算,多數是在io讀寫將執行緒堵塞掉了,這個時候執行緒切換是很合理的,反正執行緒只是單純地等待,在這個等待的時候去做其他的事情,資源利用率就上去了。

多執行緒:

多執行緒即在乙個程序中啟動多個執行緒執行任務。一般來說使用多執行緒可以達到並行的目的,但由於python中使用了全域性解釋鎖gil的概念,導致python中的多執行緒並不是並行執行,而是「交替執行」。

所以python中的多執行緒適合io密集型任務,而不適合計算密集型任務。

python提供兩組多執行緒介面,一是thread模組_thread,提供低等級介面。二是threading模組,提供更容易使用的基於物件的介面,可以繼承thread物件來實現執行緒,此外其還提供了其它執行緒相關的物件,例如timer,lock等。

多程序:

由於python中gil的原因,對於計算密集型任務,python下比較好的並行方式是使用多程序,這樣可以非常有效的使用cpu資源。當然同一時間執行的程序數量取決你電腦的cpu核心數。

python中的程序模組為mutliprocess模組,提供了很多容易使用的基於物件的介面。另外它提供了封裝好的管道和佇列,可以方便的在程序間傳遞訊息。python還提供了程序池pool物件,可以方便的管理和控制線程。

參考: python高階:聊聊io密集型任務、計算密集型任務,以及多執行緒、多程序

Python 程序,執行緒, 協程

程序是系統進行資源分配和排程的乙個獨立單位 最小單位 程序的幾個狀態 空 新建 建立執行乙個程式的新程序,可能的事件有 新的批處理作業 互動登入 終端使用者登入到系統 作業系統因為提供一項服務而建立 由現有的程序派生等。新建 就緒 作業系統準備好再接納乙個程序時,把乙個程序從新建態轉換為就緒態。就緒...

程序 執行緒 協程

多程序多執行緒的最終目地都是為了加快任務處理的時間,但是受限於cpu核數 只有多核才能實現並行,任務耗時 單核任務耗時 cpu核數 那麼在單核上執行多程序多執行緒是不是沒有用了,加快不了處理的速度了?答案肯定是不是的,不然這個東西設計出來太雞肋了,那它們加快處理的原理是什麼呢?乙個程序耗時 b程序耗...

程序 執行緒 協程

程序是系統資源分配的最小單位,系統由乙個個程序 程式 組成。一般情況下,包括文字區域 text region 資料區域 data region 和堆疊 stack region 檔案描述符表 程序每次開啟乙個檔案,系統就會在該程序的使用者檔案描述符表中分配乙個相應的表項,表項的索引返回給該程序,用於...