python學習筆記 十三 多執行緒多程序

2022-08-14 23:42:21 字數 4284 閱讀 3875

一、執行緒&程序

對於作業系統來說,乙個任務就是乙個程序(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模組

下面是乙個簡單多執行緒

import

threading

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() #

啟動另乙個執行緒

下面是另一種啟動多執行緒的方式,繼承式

import

threading

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,等待執行緒結束

import

threading

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

')

守護執行緒,什麼是守護執行緒呢,就相當於你是乙個國王(非守護執行緒),然後你有很多僕人(守護執行緒),這些僕人都是為你服務的,一但你死了,那麼你的僕人都給你陪葬。

import

threading

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

')

執行緒鎖,執行緒鎖就是,很多執行緒一起在操作乙個資料的時候,可能會有問題,就要把這個資料加個鎖,同一時間只能有乙個執行緒操作這個資料。

import

threading

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)

下面來個簡單的爬蟲,看下多執行緒的效果

import

threading

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 import

process

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...