Python 是運(yùn)行在解釋器中的語(yǔ)言,查找資料知道, python 中有一個(gè)全局鎖( GI),在使用多進(jìn)程( Threa)的情況下,不能發(fā)揮多核的優(yōu)勢(shì)。而使用多進(jìn)程( Multiprocess),則可以發(fā)揮多核的優(yōu)勢(shì)真正地提高效率。
對(duì)比實(shí)驗(yàn)
資料顯示,如果多線程的進(jìn)程是 CPU 密集型的,那多線程并不能有多少效率上的提升,相反還可能會(huì)因?yàn)榫€程的頻繁切換,導(dǎo)致效率下降,推薦使用多進(jìn)程;如果是 IO 密集型,多線程進(jìn)程可以利用 IO 阻塞等待時(shí)的空閑時(shí)間執(zhí)行其他線程,提升效率。所以我們根據(jù)實(shí)驗(yàn)對(duì)比不同場(chǎng)景的效率
(1)引入所需要的模塊
(2)定義 CPU 密集的計(jì)算函數(shù)
(3)定義 IO 密集的文件讀寫函數(shù)
(4) 定義網(wǎng)絡(luò)請(qǐng)求函數(shù)
(5)測(cè)試線性執(zhí)行 IO 密集操作、 CPU 密集操作所需時(shí)間、網(wǎng)絡(luò)請(qǐng)求密集型操作所需時(shí)間
輸出
CPU 密集:95.6059999466、91.57099986076355 92.52800011634827、 99.96799993515015
IO 密集:24.25、21.76699995994568、21.769999980926514、22.060999870300293
網(wǎng)絡(luò)請(qǐng)求密集型:4.519999980926514、8.563999891281128、4.371000051498413、4.522000074386597、14.671000003814697
(6)測(cè)試多線程并發(fā)執(zhí)行 CPU 密集操作所需時(shí)間
(7)測(cè)試多線程并發(fā)執(zhí)行 IO 密集操作所需時(shí)間
(8)測(cè)試多線程并發(fā)執(zhí)行網(wǎng)絡(luò)密集操作所需時(shí)間
Output : 0.7419998645782471、0.3839998245239258、0.3900001049041748
(9)測(cè)試多進(jìn)程并發(fā)執(zhí)行 CPU 密集操作所需時(shí)間
Output : 54.342000007629395、53.437999963760376
(10)測(cè)試多進(jìn)程并發(fā)執(zhí)行 IO 密集型操作
Output : 12.509000062942505、13.059000015258789
(11)測(cè)試多進(jìn)程并發(fā)執(zhí)行 Http 請(qǐng)求密集型操作
Output : 0.5329999923706055、0.4760000705718994
實(shí)驗(yàn)結(jié)果
CPU 密集型操作 IO 密集型操作網(wǎng)絡(luò)請(qǐng)求密集型操作
通過上面的結(jié)果,我們可以看到:
多線程在 IO 密集型的操作下似乎也沒有很大的優(yōu)勢(shì)(也許 IO 操作的任務(wù)再繁重一些就能體現(xiàn)出優(yōu)勢(shì)),在 CPU 密集型的操作下明顯地比單線程線性執(zhí)行性能更差,但是對(duì)于網(wǎng)絡(luò)請(qǐng)求這種忙等阻塞線程的操作,多線程的優(yōu)勢(shì)便非常顯著了
多進(jìn)程無論是在 CPU 密集型還是 IO 密集型以及網(wǎng)絡(luò)請(qǐng)求密集型(經(jīng)常發(fā)生線程阻塞的操作)中,都能體現(xiàn)出性能的優(yōu)勢(shì)。不過在類似網(wǎng)絡(luò)請(qǐng)求密集型的操作上,與多線程相差無幾,但卻更占用 CPU 等資源,所以對(duì)于這種情況下,我們可以選擇多線程來執(zhí)行。
-
cpu
+關(guān)注
關(guān)注
68文章
11080瀏覽量
217099 -
python
+關(guān)注
關(guān)注
56文章
4827瀏覽量
86759
發(fā)布評(píng)論請(qǐng)先 登錄
恒訊科技深度解析:阿帕奇服務(wù)器工作原理
Linux進(jìn)程狀態(tài)詳解

進(jìn)程、線程、協(xié)程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!
請(qǐng)問如何在Python中實(shí)現(xiàn)多線程與多進(jìn)程的協(xié)作?
使用Python實(shí)現(xiàn)xgboost教程
做的是LED多進(jìn)制幅移鍵控通信,怎么解調(diào)信號(hào)?
深入解析Linux程序與進(jìn)程

手寫圖像模板匹配算法在OpenCV中的實(shí)現(xiàn)

一文搞懂Linux進(jìn)程的睡眠和喚醒
Python中多線程和多進(jìn)程的區(qū)別

評(píng)論