python是執行在直譯器中的語言,查詢資料知道,python中有乙個全域性鎖(gil),在使用多執行緒(thread)的情況下,不能發揮多核的優勢。而使用多程序(multiprocess),則可以發揮多核的優勢真正地提高效率。
資料顯示,如果多執行緒的程序是cpu密集型的,那多執行緒並不能有多少效率上的提公升,相反還可能會因為執行緒的頻繁切換,導致效率下降,推薦使用多程序;如果是io密集型,多執行緒程序可以利用io阻塞等待時的空閒時間執行其他執行緒,提公升效率。所以我們根據實驗對比不同場景的效率
作業系統
cpu記憶體
硬碟windows 10
雙核8gb
機械硬碟
(1)引入所需要的模組12
34import requests
import time
from threading import thread
from multiprocessing import process
(2)定義cpu密集的計算函式
python12
3456
7defcount(x,y):
# 使程式完成150萬計算
c=0whilec<500000:
c+=1
x+=x
y+=y
(3)定義io密集的檔案讀寫函式12
3456
78910
def write():
f=open("test.txt","w")
forxinrange(5000000):
f.write("testwrite\n")
f.close()
def read():
f=open("test.txt","r")
lines=f.readlines()
f.close()
(4) 定義網路請求函式12
3456
78910
_head=
except exception ase:
return
(5)測試線性執行io密集操作、cpu密集操作所需時間、網路請求密集型操作所需時間12
3456
78910
1112
1314
1516
1718
# cpu密集操作
t=time.time()
forxinrange(10):
count(1,1)
print("line cpu",time.time()-t)
# io密集操作
t=time.time()
forxinrange(10):
write()
read()
print("line io",time.time()-t)
# 網路請求密集型操作
輸出(6)測試多執行緒併發執行cpu密集操作所需時間
python12
3456
78910
1112
1314
15counts=
t=time.time()
forxinrange(10):
thread=thread(target=count,args=(1,1))
thread.start()
e=counts.__len__()
whiletrue:
forth incounts:
ifnotth.is_alive():
e-=1
ife<=0:
break
print(time.time()-t)
output: 99.9240000248 、101.26400017738342、102.32200002670288(7)測試多執行緒併發執行io密集操作所需時間
python12
3456
78910
1112
1314
1516
1718
1920
defio():
write()
read()
t=time.time()
ios=
t=time.time()
forxinrange(10):
thread=thread(target=count,args=(1,1))
thread.start()
e=ios.__len__()
whiletrue:
forth inios:
ifnotth.is_alive():
e-=1
ife<=0:
break
print(time.time()-t)
output: 25.69700002670288、24.02400016784668(8)測試多執行緒併發執行網路密集操作所需時間
(9)測試多程序併發執行cpu密集操作所需時間
python12
3456
78910
1112
1314
counts=
t=time.time()
forxinrange(10):
process=process(target=count,args=(1,1))
process.start()
e=counts.__len__()
whiletrue:
forth incounts:
ifnotth.is_alive():
e-=1
ife<=0:
break
print("multiprocess cpu",time.time()-t)
output: 54.342000007629395、53.437999963760376(10)測試多程序併發執行io密集型操作
python12
3456
78910
1112
1314
1516
t=time.time()
ios=
t=time.time()
forxinrange(10):
process=process(target=io)
process.start()
e=ios.__len__()
whiletrue:
forth inios:
ifnotth.is_alive():
e-=1
ife<=0:
break
print("multiprocess io",time.time()-t)
output: 12.509000062942505、13.059000015258789(11)測試多程序併發執行http請求密集型操作
cpu密集型操作
io密集型操作
網路請求密集型操作
線性操作
94.91824996469
22.46199995279
7.3296000004
多執行緒操作
101.1700000762
24.8605000973
0.5053332647
多程序操作
53.8899999857
12.7840000391
0.5045000315
通過上面的結果,我們可以看到:
單執行緒和多執行緒
what 1.程序 當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。2.執行緒 執行緒就是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 是可以共享的,即不同的執行緒可以執行相同的函式。3.多執行緒 多執行緒是指程式中包含多個...
單執行緒和多執行緒
普通的程式預設都是單執行緒,程式的執行方式是從上至下序列執行,示例 import time deffunc a,b time.sleep 1 print a b s time.time func 5,10 func 2,5 func 6,84 func 9,46 e time.time print ...
單執行緒 多執行緒
1.基於python的單執行緒示例 from time import ctime,sleep import time def play video video for i in range 2 print i am playing video s at s video,ctime sleep 5 d...