簡(jiǎn)單理解一下這三個(gè)東西!
多進(jìn)程:
一個(gè)程序加用到的資源稱之為進(jìn)程,它是操作系統(tǒng)分配資源的基本單位,每個(gè)進(jìn)程都有一個(gè)GIL鎖,它有自己獨(dú)立的內(nèi)存空間,資源消耗大。
多線程:
多線程并不是真正意義上的多任務(wù),因?yàn)檫M(jìn)程有GIL鎖的存在,線程執(zhí)行前要先獲得GIL鎖才可以執(zhí)行,執(zhí)行代碼直到sleep或者python虛擬機(jī)將其掛起,釋放GIL鎖,線程進(jìn)行鎖競(jìng)爭(zhēng),切換線程,會(huì)消耗資源,并且由于GIL鎖的存在,一個(gè)進(jìn)程永遠(yuǎn)只有一個(gè)線程被執(zhí)行,因?yàn)橐@得GIL鎖才可以執(zhí)行。雖然是這樣,并不是說(shuō)多線程沒(méi)用,像IO密集型代碼(文件處理、網(wǎng)絡(luò)爬蟲(chóng)等),多線程能夠有效提升效率(單線程下有IO操作會(huì)進(jìn)行IO等待,造成不必要的時(shí)間浪費(fèi),如果開(kāi)啟了多線程,那么線程A在等待時(shí),會(huì)切換到線程B,可以不浪費(fèi)CPU的資源,從而提升程序執(zhí)行的效率),如果對(duì)于CPU密集型多線程反而是雞肋。
多核CPU可以開(kāi)多進(jìn)程充分利用CPU的效率,每個(gè)進(jìn)程再開(kāi)多線程,節(jié)約IO等待時(shí)間。
協(xié)程:
依賴于線程存在的,利用線程在等待某個(gè)資源的時(shí)候去執(zhí)行其他的函數(shù),像多線程實(shí)現(xiàn)的下載器,一邊在下載文件一邊在保存文件,此時(shí)線程就卡在下載這,這時(shí)候就可以利用協(xié)程,你在等待的時(shí)間,我去執(zhí)行別的函數(shù),協(xié)程一般用gevent模塊。