程序和執行緒之間的關係:
執行緒是屬於程序的,執行緒執行在程序空間內,同一程序所產生的執行緒共享同一記憶體空間,當程序退出時該程序所產生的執行緒都會被強制退出並清除。執行緒可與屬於同一程序的其它執行緒共享程序所擁有的全部資源,但是其本身基本上不擁有系統資源,只擁有一點在執行中必不可少的資訊(如程式計數器、一組暫存器和棧)。
執行緒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 檔案描述符表 程序每次開啟乙個檔案,系統就會在該程序的使用者檔案描述符表中分配乙個相應的表項,表項的索引返回給該程序,用於...