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