多进程与多线程区别、优缺点(Python)
多進(jìn)程
在Linux系統(tǒng)下,使用os.fork(),?調(diào)用一次,返回兩次,操作系統(tǒng)自動(dòng)把當(dāng)前進(jìn)程(父進(jìn)程)復(fù)制了一份(子進(jìn)程),然后分別在父進(jìn)程和子進(jìn)程內(nèi)返回。子進(jìn)程永遠(yuǎn)返回0,父進(jìn)程返回子進(jìn)程的ID。經(jīng)過這樣做,父進(jìn)程就能fork出很多子進(jìn)程,并可以記錄下子進(jìn)程的ID號(hào)了,子進(jìn)程可以通過getppid()來獲取父進(jìn)程ID。fork()僅在Unix/Linux下使用,windows則不行。 所以,在Python中,存在一個(gè)跨平臺(tái)的包mutiprocessing,通過引入包中的Process類,就可以創(chuàng)建多進(jìn)程程序了,可以創(chuàng)建一個(gè)進(jìn)程p=Process(target=func,args=(*,)),然后利用p.start()及p.join()來執(zhí)行了。以上的join()方法可以等待子進(jìn)程結(jié)束后才往下執(zhí)行,通常用于進(jìn)程間同步。 另外,可以用進(jìn)程池的方式,例如p=Pool(n),然后p.apply_async(func,args),這里可以使用n種不同的參數(shù)傳入,建立不同的進(jìn)程。用這種方式時(shí),在調(diào)用join()方法前,要先調(diào)用close()方法,使得不能再添加新進(jìn)程。 mutiprocessing包里提供了Queue、Pipe等多種進(jìn)程間通信的方法。可以直接引入Queue類,然后實(shí)例化一個(gè)對(duì)象。則不同的進(jìn)程可以使用put方法發(fā)信息,同時(shí)可以使用get方法取信息。
多線程
多個(gè)任務(wù)可以創(chuàng)建多個(gè)進(jìn)程來完成,同時(shí)也可以創(chuàng)建多個(gè)線程來完成,線程是操作系統(tǒng)直接的執(zhí)行單元。 Python含有 threading 這個(gè)高級(jí)模塊,要啟動(dòng)一個(gè)線程,就是把一個(gè)函數(shù)傳出并創(chuàng)建Thread實(shí)例,然后調(diào)用start()方法開始執(zhí)行,例如 t=threading.Thread(target=func,name=*) ,注意這里的name屬性,它是給線程命名的,缺省值為Thread-1···。要注意的是,剛才說了,任何一個(gè)進(jìn)程都含有一個(gè)線程,而這個(gè)主線程則執(zhí)行著我們編寫的程序,可以調(diào)用 threading.current_thread().name 來查看它,它的名字就叫MainThread。 在多線程編程中,有一個(gè)最大的問題就在于進(jìn)程內(nèi)的資源被各個(gè)線程所共享,進(jìn)程內(nèi)任何變量都可以被任何一個(gè)線程修改,因此,線程之間若去修改同一個(gè)變量,則可能導(dǎo)致程序Bug。所以,引入了鎖機(jī)制。 當(dāng)某個(gè)線程去修改某個(gè)變量時(shí),可以在變量所在的方法內(nèi)加一把鎖,使得其他線程不能同時(shí)執(zhí)行該方法,只有釋放了鎖后,其他線程才能去獲得鎖并獲得修改權(quán)。創(chuàng)建一個(gè)鎖是通過 lock=threading.Lock() 來實(shí)現(xiàn)的,可以使用 try···finally··· 語句,在try之前使用 lock.acquire() 獲得鎖,然后在try語句里面修改變量,然后在finally語句里加 lock.release() 來保證鎖一定被釋放,避免成為一個(gè)死鎖。區(qū)別于聯(lián)系
? ? ? ? 多進(jìn)程的優(yōu)點(diǎn)是穩(wěn)定性好,一個(gè)子進(jìn)程崩潰了,不會(huì)影響主進(jìn)程以及其余進(jìn)程。但是缺點(diǎn)是創(chuàng)建進(jìn)程的代價(jià)非常大,因?yàn)椴僮飨到y(tǒng)要給每個(gè)進(jìn)程分配固定的資源,并且,操作系統(tǒng)對(duì)進(jìn)程的總數(shù)會(huì)有一定的限制,若進(jìn)程過多,操作系統(tǒng)調(diào)度都會(huì)存在問題,會(huì)造成假死狀態(tài)。
? ? ? ? 多線程優(yōu)點(diǎn)是效率較高一些,但是致命的缺點(diǎn)是任何一個(gè)線程崩潰都可能造成整個(gè)進(jìn)程的崩潰,因?yàn)樗鼈児蚕砹诉M(jìn)程的內(nèi)存資源池。 對(duì)于任務(wù)數(shù)來說,無論是多進(jìn)程或者多線程,都不能太多。因?yàn)椴僮飨到y(tǒng)在切換任務(wù)時(shí),會(huì)有一系列的保護(hù)現(xiàn)場(chǎng)措施,這要花費(fèi)相當(dāng)?shù)南到y(tǒng)資源,若任務(wù)過多,則大部分資源都被用做干這些了,結(jié)果就是所有任務(wù)都做不好,所以操作系統(tǒng)會(huì)限制進(jìn)程的數(shù)量。 另外,考慮計(jì)算密集型及IO密集型應(yīng)用程序。對(duì)于計(jì)算密集型,多任務(wù)勢(shì)必造成資源浪費(fèi)。對(duì)于IO密集型,因?yàn)镮O速度遠(yuǎn)低于CPU計(jì)算速度,所以使用多任務(wù)方式可以大大增大程序運(yùn)行效率。
總結(jié)
以上是生活随笔為你收集整理的多进程与多线程区别、优缺点(Python)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自定义配置 mpv 播放器
- 下一篇: websocket python爬虫_p