日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

多进程与多线程区别、优缺点(Python)

發(fā)布時(shí)間:2023/12/20 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多进程与多线程区别、优缺点(Python) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

多進(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。