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 密集的文件讀寫(xiě)函數(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)求密集型操作
通過(guò)上面的結(jié)果,我們可以看到:
多線程在 IO 密集型的操作下似乎也沒(méi)有很大的優(yōu)勢(shì)(也許 IO 操作的任務(wù)再繁重一些就能體現(xiàn)出優(yōu)勢(shì)),在 CPU 密集型的操作下明顯地比單線程線性執(zhí)行性能更差,但是對(duì)于網(wǎng)絡(luò)請(qǐng)求這種忙等阻塞線程的操作,多線程的優(yōu)勢(shì)便非常顯著了
多進(jìn)程無(wú)論是在 CPU 密集型還是 IO 密集型以及網(wǎng)絡(luò)請(qǐng)求密集型(經(jīng)常發(fā)生線程阻塞的操作)中,都能體現(xiàn)出性能的優(yōu)勢(shì)。不過(guò)在類似網(wǎng)絡(luò)請(qǐng)求密集型的操作上,與多線程相差無(wú)幾,但卻更占用 CPU 等資源,所以對(duì)于這種情況下,我們可以選擇多線程來(lái)執(zhí)行。
-
cpu
+關(guān)注
關(guān)注
68文章
10890瀏覽量
212430 -
python
+關(guān)注
關(guān)注
56文章
4802瀏覽量
84885
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論