標籤:mon -- nbsp strong 速度 用法 一件事 程式 nis
一、解釋:
相信百分之百的同學都會用到作業系統,別說不用,不用的話特麼你怎麼看的我的部落格,而我們的作業系統你可以一遍看著我寫的部落格,又一遍聽著音樂,說到音樂給大家推薦一首叫做"Shape of You",而我就是邊聽著音樂邊寫部落格,哈哈.....;那麼這裡我們就要想了,我們的電腦又是怎麼來運算的呢?怎麼同時開啟這麼多任務的呢?而且還有好多任務偷偷的在後台運行著呢,只是案頭上沒有顯示而已。
而現在多核心多線程的電腦已經很普及,是的,這樣計算的並發可以更多更快,但是在電腦剛流行的時候,很多單核CPU又怎麼執行多任務的呢?畢竟CPU執行代碼都是按照順序執行的;而答案就是電腦上的作業系統輪流讓各個任務交替執行,任務A執行0.01秒,切換到任務B上執行0.01秒,再切換到任務3上,這樣反覆下去,表面上看每個任務都是交替執行的,但是,由於CPU的執行速度實在是太快了,我們感覺就像所有任務都在同時執行一樣。
所以,我們在日常啟動並執行環境中,並存執行多任務只能在多核心多線程的CPU上實現,但是我們有的時候任務數量遠遠多於CPU的核心數量,所以,作業系統也會自動把很多任務輪流調度到每個核心上執行。
對於作業系統來說,一個任務就是一個進程(Process),比如開啟一個瀏覽器就是啟動一個瀏覽器進程,開啟一個記事本就啟動了一個記事本進程,開啟兩個記事本就啟動了兩個記事本進程,開啟一個Word就啟動了一個Word進程。
有些進程還不止同時幹一件事,比如Word,它可以同時進行打字、拼字檢查、列印等事情。在一個進程內部,要同時幹多件事,就需要同時運行多個“子任務”,我們把進程內的這些“子任務”稱為線程(Thread)。
由於每個進程至少要幹一件事,所以,一個進程至少有一個線程。當然,像Word這種複雜的進程可以有多個線程,多個線程可以同時執行,多線程的執行方式和多進程是一樣的,也是由作業系統在多個線程之間快速切換,讓每個線程都短暫地交替運行,看起來就像同時執行一樣。當然,真正地同時執行多線程需要多核CPU才可能實現。
總結:
應用程式--->進程--->線程
應用程式最少有一個進程,而一個進程最後有一個主線程,而一個程式可以啟多個進程,一個進程可以啟動多個線程,而它們都有自己的主進程和主線程,而進程和線程都是有CPU來運算,運算方式就是來回切換運算。
線程和進程Python與其它開發語言的不同,其它語言線程之間可以在多個CPU之間切換,而Python不支援多線程,只能多進程(前提是被CPU調用),所以出現了以下應用情境
應用情境:
IO密集型:多線程
計算密集型:多進程
GIL,全域解譯器鎖,保證同一個進程中只有一個線程同時被調用
二、線程的使用
看代碼
import threading #匯入線程的模組import timedef task(a): #進程的函數 time.sleep(1) #等待一秒 print(a)for i in range(30): #同時啟動30個線程 t = threading.Thread(target=task,args=[i,]) #建立了進程,target表示要建立的進程 t.start() #進程啟動,表示開始工作print("end") #啟動主進程
setDaemon的用法
說明:setDaemon 設定主進程是否等待子線程結束了,再結束自己,預設選項為(False)
例子: (預設選項)
import threading #匯入線程的模組import timedef task(a): #進程的函數 time.sleep(1) #等待一秒 print(a)for i in range(5): t = threading.Thread(target=task,args=[i,]) #建立了進程,target表示要建立的進程 t.setDaemon(False) #主進程是否等待子線程,False 是等待 True是不等待 t.start() #進程啟動print("end") #啟動主進程###輸出如下:C:\Python35\python.exe D:/linux/python/day-test/day9/test1.pyend02134
非預設選項(True)
import threading #匯入線程的模組
import time
def task(a): #進程的函數
time.sleep(1) #等待一秒
print(a)
for i in range(5):
t = threading.Thread(target=task,args=[i,]) #建立了進程,target表示要建立的進程
t.setDaemon(True) #主進程是否等待子線程,False 是等待 True是不等待
t.start() #進程啟動
print("end") #啟動主進程
輸出如下:
import threading #匯入線程的模組import timedef task(a): #進程的函數 time.sleep(1) #等待一秒 print(a)for i in range(5): t = threading.Thread(target=task,args=[i,]) #建立了進程,target表示要建立的進程 t.setDaemon(True) #主進程是否等待子線程,False 是等待 True是不等待 t.start() #進程啟動print("end") #啟動主進程##下面沒有等子線程就結束C:\Python35\python.exe D:/linux/python/day-test/day9/test1.pyendProcess finished with exit code 0
join用法
import threading #匯入線程的模組import timedef task(a): #進程的函數 time.sleep(3) #等待一秒 print(a)for i in range(5): t = threading.Thread(target=task,args=[i,]) #建立了進程,target表示要建立的進程 t.setDaemon(False) #主進程是否等待子線程,False 是等待 True是不等待 t.start() #進程啟動 t.join() #等待的最大時間,等待的是子線程的已耗用時間,預設為一直等print("end") #啟動主進程#輸出:C:\Python35\python.exe D:/linux/python/day-test/day9/test1.py01234end
線程的鎖
單個鎖
import threadingimport timev = 10#1、只能一個人使用鎖#lock = threading.Lock() #此鎖只能鎖一次lock = threading.RLock() #此鎖可以鎖多層def task(arg): time.sleep(2) #申請使用鎖,其他人等待 lock.acquire() lock.acquire() lock.acquire() global v v -= 1 print(v) #釋放 lock.release() lock.release() lock.release()for i in range(10): t = threading.Thread(target=task,args=(i,)) t.start()
多個人的鎖
import threadingimport timev = 10#1、多個人使用鎖lock = threading.BoundedSemaphore(3) #此鎖可以被多人使用3代表3個人同時使用def task(arg): # time.sleep(2) #申請使用鎖,其他人等待 lock.acquire() time.sleep(1) global v v -= 1 print(v) #釋放 lock.release()for i in range(10): t = threading.Thread(target=task,args=(i,)) t.start()
事件鎖
import requestsimport threadingimport timelock = threading.Event() #進程鎖的方式def task(arg): time.sleep(1) lock.wait() #進程等候命令,開鎖 print(arg)for i in range(5): t = threading.Thread(target=task,args=(i,)) t.start()while True: value = input(">>>>>") if value == "1": lock.set() #開鎖#輸出:C:\Python35\python.exe D:/linux/python/day-test/day9/事件鎖.py>>>>>>>>>>2>>>>>1 #輸入1之後開鎖>>>>>04312
自訂鎖,自己設定線程的鎖的個數
import threadingimport timelock = threading.Condition()def task(arg): time.sleep(1) #鎖住所有線程 lock.acquire() #獲得鎖 lock.wait() #鎖等候 #申請使用鎖,其他人等待 print("線程",arg) lock.release() #釋放鎖for i in range(10): t = threading.Thread(target=task,args=(i,)) t.start()while True: value = input(">>>>>>>>") lock.acquire() #獲得鎖 lock.notify(int(value)) #設定釋放的線程,你寫幾個上麵線程釋放幾個 lock.release() #釋放鎖
輸出:
>>>>>>>>6>>>>>>>>線程 2線程 4線程 3線程 1線程 0線程 8
python-進程、線程