由于GIL的存在论巍,無(wú)論是python2還是python3都無(wú)法很好地利用多線程并發(fā)執(zhí)行。
對(duì)于單核CPU而言,多線程就是為了降低阻塞。在某個(gè)thread進(jìn)行IO的時(shí)候sleep掉缚甩,轉(zhuǎn)而去執(zhí)行另一個(gè)thread,可以更有效地利用CPU窑邦。
對(duì)于多核CPU而言,多線程的作用是為了利用多核CPU的性能壕探,使之可以協(xié)同并進(jìn)處理數(shù)據(jù)冈钦,但是會(huì)遇到核與核之間數(shù)據(jù)保持一致和執(zhí)行同步的問(wèn)題。為此python設(shè)計(jì)了GIL這么一個(gè)東西李请,它的機(jī)制是將一個(gè)python進(jìn)程的執(zhí)行限定在一個(gè)核內(nèi)(一個(gè)時(shí)刻必須在一個(gè)核瞧筛,但是可以切換),可以理解為是線程安全的导盅。
我覺(jué)得…這TMD是BUG吧较幌,分明是多線程調(diào)度算法寫(xiě)挫了之后的替代品,這樣搞的話在多核時(shí)代python的多線程就是個(gè)笑話…
冷靜分析白翻,GIL的存在還收有優(yōu)點(diǎn)的:IO密集的程序中可以提速乍炉;提醒使用者,要實(shí)現(xiàn)運(yùn)算密集的程序轉(zhuǎn)而用其他更低級(jí)一些的高級(jí)語(yǔ)言(比如C/C++)實(shí)現(xiàn)滤馍。
但是對(duì)于普通使用者而言岛琼,是沒(méi)有時(shí)間轉(zhuǎn)而用低級(jí)語(yǔ)言再設(shè)計(jì)通信接口的。好在python的multiprocessing庫(kù)可以輔助解決GIL的存在巢株,但是又面臨了新的問(wèn)題:進(jìn)程之間數(shù)據(jù)通信的問(wèn)題槐瑞,做法網(wǎng)上有很多了,推薦一個(gè)博客:http://blog.csdn.net/shaohui973/article/details/8142797