當(dāng)單任務(wù)不能滿足工作的需要尼变,只是需要使用多任務(wù),多任務(wù)分為多進(jìn)程梗劫,多線程享甸,多協(xié)程
先有進(jìn)程,進(jìn)程創(chuàng)建線程梳侨,線程依附于進(jìn)程蛉威,線程里面包含多個(gè)協(xié)程
進(jìn)程是系統(tǒng)資源調(diào)配的基本單位,線程是系統(tǒng)調(diào)度的基本單位走哺,是代碼執(zhí)行的分支蚯嫌,協(xié)程是比線程占用資源還小的執(zhí)行單元,它自帶cpu的上下文丙躏,他可以在不開(kāi)辟線程的基礎(chǔ)上來(lái)實(shí)現(xiàn)多任務(wù)择示。
創(chuàng)建一條進(jìn)程需要向操作系統(tǒng)索要資源,創(chuàng)建線程需要向?qū)?yīng)的進(jìn)程索要資源晒旅,創(chuàng)建協(xié)程需要向相應(yīng)的線程索要資源栅盲,所以,進(jìn)程最是消耗資源废恋,其次線程谈秫,最后協(xié)程
進(jìn)程之間不共享全局變量,需要靠queue隊(duì)列來(lái)進(jìn)行各個(gè)進(jìn)程間的通信鱼鼓。線程間共享全局變量拟烫,但其中會(huì)出現(xiàn)資源競(jìng)爭(zhēng),這時(shí)需要使用同步方法即子進(jìn)程加入主進(jìn)程迄本,或者互斥鎖硕淑,在使用互斥鎖時(shí)可能會(huì)出現(xiàn)死鎖,這時(shí)我們需要對(duì)其進(jìn)行手動(dòng)解鎖嘉赎,可以使用延時(shí)或者銀行家算法
進(jìn)程和線程里面是無(wú)序的置媳,主進(jìn)程或者線程需要等到子進(jìn)程或線程結(jié)束才會(huì)結(jié)束。如果需要主進(jìn)程結(jié)束同時(shí)子進(jìn)程銷毀曹阔,需要加入守護(hù)主進(jìn)程或主線程半开,協(xié)程是按照一定的順序來(lái)交替執(zhí)行,主協(xié)程不會(huì)等待子協(xié)程結(jié)束而結(jié)束赃份,這是需要將子協(xié)程加入主協(xié)程里面
進(jìn)程和協(xié)程只能實(shí)現(xiàn)并發(fā),協(xié)程可以實(shí)現(xiàn)并行
進(jìn)程創(chuàng)建調(diào)用muilprocessing包里面的Process模塊,線程創(chuàng)建調(diào)用threading里面的Thread模塊抓韩,協(xié)程主要是調(diào)用封裝好的geven模塊
進(jìn)程還可以使用進(jìn)程池來(lái)創(chuàng)建纠永,進(jìn)程池是一個(gè)用來(lái)裝多個(gè)進(jìn)程的容器,進(jìn)程池通過(guò)multiprocessing里面的Pool來(lái)創(chuàng)建谒拴。當(dāng)需要大批量調(diào)用進(jìn)程來(lái)工作尝江,我們可以直接調(diào)用進(jìn)程池,進(jìn)程池的進(jìn)程數(shù)量是可控的英上,即可以規(guī)定多少個(gè)進(jìn)程同時(shí)工作炭序。進(jìn)程池里面的進(jìn)程間的通信采用multiprocessing里面manage里面的queue隊(duì)列來(lái)實(shí)現(xiàn)。主進(jìn)程不會(huì)等待進(jìn)程池結(jié)束后結(jié)束苍日,這時(shí)我們需要關(guān)閉進(jìn)程池不在接收子進(jìn)程惭聂,然后加入主進(jìn)程
多進(jìn)程穩(wěn)定性強(qiáng),但耗費(fèi)資源太多相恃,一般用于計(jì)算密集型辜纲。多線程運(yùn)行速度一般,消耗資源比進(jìn)程要小拦耐,但由于gui鎖的存在耕腾,線程不是真正意義上的多任務(wù),一般不使用杀糯;協(xié)程運(yùn)行速度快扫俺,消耗資源小于線程,一般多用于爬蟲(chóng)固翰,網(wǎng)絡(luò)服務(wù)請(qǐng)求