一、執行緒&程序
對於作業系統來說,乙個任務就是乙個程序(process),比如開啟乙個瀏覽器就是啟動乙個瀏覽器程序,開啟乙個記事本就啟動了乙個記事本程序,開啟兩個記事本就啟動了兩個記事本程序,開啟乙個word就啟動了乙個word程序。程序是很多資源的集合。
有些程序還不止同時幹一件事,比如word,它可以同時進行打字、拼寫檢查、列印等事情。在乙個程序內部,要同時幹多件事,就需要同時執行多個「子任務」,我們把程序內的這些「子任務」稱為執行緒(thread)。
由於每個程序至少要幹一件事,所以,乙個程序至少有乙個執行緒。當然,像word這種複雜的程序可以有多個執行緒,多個執行緒可以同時執行,多執行緒的執行方式和多程序是一樣的,也是由作業系統在多個執行緒之間快速切換,讓每個執行緒都短暫地交替執行,看起來就像同時執行一樣。當然,真正地同時執行多執行緒需要多核cpu才可能實現。執行緒是最小的執行單元,而程序由至少乙個執行緒組成。
我們在做事情的時候,乙個人做是比較慢的,如果多個人一起來做的話,就比較快了,程式也是一樣的,我們想執行的速度快一點的話,就得使用多程序,或者多執行緒,在python裡面,多執行緒被很多人詬病,為什麼呢,因為python的直譯器使用了gil的乙個叫全域性直譯器鎖,它不能利用多核cpu,只能執行在乙個cpu上面,但是你在執行程式的時候,看起來好像還是在一起執行的,是因為作業系統輪流讓各個任務交替執行,任務1執行0.01秒,切換到任務2,任務2執行0.01秒,再切換到任務3,執行0.01秒……這樣反覆執行下去。表面上看,每個任務都是交替執行的,但是,由於cpu的執行速度實在是太快了,我們感覺就像所有任務都在同時執行一樣。這個叫做上下文切換。
二、多執行緒,python中的多執行緒使用theading模組
下面是乙個簡單多執行緒
importthreading
import
time
def sayhi(num): #
定義每個執行緒要執行的函式
print("
running on number:%s
" %num)
time.sleep(3)
if__name__ == '
__main__':
t1 = threading.thread(target=sayhi,args=(1,)) #
生成乙個執行緒例項
t2 = threading.thread(target=sayhi,args=(2,)) #
生成另乙個執行緒例項
t1.start() #
啟動執行緒
t2.start() #
啟動另乙個執行緒
下面是另一種啟動多執行緒的方式,繼承式
importthreading
import
time
class
mythread(threading.thread):
def__init__
(self,num):
threading.thread.
__init__
(self)
self.num =num
def run(self):#
定義每個執行緒要執行的函式
print("
running on number:%s
" %self.num)
time.sleep(3)
if__name__ == '
__main__':
t1 = mythread(1)
t2 = mythread(2)
t1.start()
t2.start()
這兩種方式沒有什麼區別,兩種寫法而已,我個人喜歡用第一種,更簡單一些。
執行緒等待,多執行緒在執行的時候,每個執行緒都是獨立執行的,不受其他的執行緒干擾,如果想在哪個執行緒執行完之後,再做其他操作的話,就得等待它完成,那怎麼等待呢,使用join,等待執行緒結束
importthreading
import
time
defrun():
print('
qqq'
) time.sleep(1)
print('
done!')
lis =
for i in range(5):
t = threading.thread(target=run)
t.start()
for t in
lis:
t.join()
print('
over
')
守護執行緒,什麼是守護執行緒呢,就相當於你是乙個國王(非守護執行緒),然後你有很多僕人(守護執行緒),這些僕人都是為你服務的,一但你死了,那麼你的僕人都給你陪葬。
importthreading
import
time
defrun():
print('
qqq'
) time.sleep(1)
print('
done!')
for i in range(5):
t = threading.thread(target=run)
t.setdaemon(true)
t.start()
print('
over
')
執行緒鎖,執行緒鎖就是,很多執行緒一起在操作乙個資料的時候,可能會有問題,就要把這個資料加個鎖,同一時間只能有乙個執行緒操作這個資料。
importthreading
from threading import
lock
num =0
lock = lock()#
申請一把鎖
defrun():
global
num lock.acquire()#加鎖
num+=1lock.release()#解鎖
lis =
for i in range(5):
t = threading.thread(target=run)
t.start()
for t in
lis:
t.join()
print('
over
',num)
下面來個簡單的爬蟲,看下多執行緒的效果
importthreading
import
requests,time
urls =
defrun(name,url):
res =requests.get(url)
with open(name+'
.html
','w
',encoding=res.encoding) as fw:
fw.write(res.text)
start_time =time.time()
lis =
for url in
urls:
t = threading.thread(target=run,args=(url,urls[url]))
t.start()
for t in
lis:
t.join()
end_time =time.time()
print('
run time is %s
'%(end_time-start_time))
#下面是單執行緒的執行時間
#start_time = time.time()
#for url in urls:
#run(url,urls[url])
#end_time = time.time()
#print('run time is %s'%(end_time-start_time))
三、多程序,上面說了python裡面的多執行緒,是不能利用多核cpu的,如果想利用多核cpu的話,就得使用多程序,python中多程序使用multiprocessing模組。
from multiprocessing importprocess
import
time
deff(name):
time.sleep(2)
print('
hello
', name)
p = process(target=f, args=('
niu'
,)) p.start()
p.join()
十三 多執行緒執行過程
1 開始狀態 start 新建立了乙個執行緒物件。2 準備狀態 ready 執行緒物件建立後 其他執行緒呼叫了該物件的start 方法。該狀態執行緒位於 可執行執行緒池 中,變得可執行,只等待獲取cpu的使用權。即在就緒狀態的程序除cpu之外,其它的執行所需資源都已全部獲得。3 執行狀態 runni...
python 多執行緒(十三 1)
玩遊戲 for i in range 3 print 玩遊戲 time.sleep 5 def network 上網 for i in range 3 print 上網.time.sleep 5 呼叫 單任務的表現 當25行 play函式呼叫沒有執行完畢之前。26行不會被執行,也就是會阻塞。play...
Python學習筆記 多執行緒
引入多執行緒模組 import threading 任何乙個程序啟動的時候會預設的啟動乙個執行緒,這個執行緒叫主線程,主線程可以啟動新的子執行緒 獲取主當前執行緒的名稱 threading.current thread name 建立子執行緒 t threading.thread target fu...