1. 程式人生 > 程式設計 >python多執行緒和多程序關係詳解

python多執行緒和多程序關係詳解

關於多執行緒的大概講解:

在Python的標準庫中給出了2個模組:_thread和threading,_thread是低階模組不支援守護執行緒,當主執行緒退出了時,全部子執行緒都會被強制退出了。而threading是高階模組,用作對_thread進行了封裝支援守護執行緒。在大部分狀況下人們只需要採用threading這個高階模組即可。

關於多程序的大概講解:

多程序是multiprocessing模組給出遠端與本地的併發,在一個multiprocessing庫的採用場景下,全部的子程序全是由一個父程序執行來的,這個父程序變成madter程序,它會管理一系列的物件狀態下,如果一旦這個程序退出了,子程序很可能處在一個不穩定的狀態下,那麼這個父程序儘量要少做事來維持其穩定性

所以python多執行緒和多程序的區別如下:

多執行緒中,全部子執行緒的程序號一樣;多程序中,不一樣的子程序程序號不一樣

執行緒共享記憶體空間;程序的記憶體是獨立的

多執行緒可以共享全域性變數,多程序做不到

同一個程序的執行緒之間可以直接交流;2個程序想通訊,必須通過一箇中間代理來實現

一個執行緒可以控制和操作同一程序裡的其他執行緒;但是程序只能操作子程序

建立新執行緒很簡單;建立新程序需要對其父程序進行一次克隆

內容擴充套件:

python多程序、多執行緒之聯絡與區別

程序

概念:程序是作業系統分配資源的最小單元  

理解:一個應用程式至少包括1個程序,每個程序在執行過程中擁有獨立的記憶體單元,python的多程序程式設計主要依靠multiprocess模組。

程序間通訊:首先,程序間是可以相互通訊的,比較常見的有七種通訊方式,如管道pipe、命名管道FIFO、訊息佇列MessageQueue、共享記憶體SharedMemory、訊號量Semaphore、套接字Socket、訊號 signal(由於實際開發涉及較少,這裡只作簡單介紹)但是通常程序之間是相互獨立的,每個程序都有獨立的記憶體。通過共享記憶體(nmap模組),程序之間可以共享物件,使多個程序可以訪問同一個變數(地址相同,變數名可能不同)。多程序共享資源必然會導致程序間相互競爭,所以應該盡最大可能防止使用共享狀態。

執行緒

概念:執行緒是作業系統排程的最小單元

理解:1個程序包括1個或多個執行緒,相比較之下,執行緒佔用資源更少,更高效,且一個程序的多個執行緒在執行過程中共享記憶體,毫無疑問,執行緒之間可以相互通訊。而python的多程序程式設計主要依靠threading模組

執行緒間通訊:主要有兩種方式,一種是上鎖,上互斥鎖確保任意時刻只有一個執行緒具備修改全域性變數的能力。另一種則是使用訊息佇列,比較經典的生產者、消費者模型就是這樣,一個負責生成,一個負責消費,所生成的產品存放在queue裡,實現了不同執行緒間溝通。

多程序跟多執行緒的區別

由於程序的建立跟銷燬都涉及到系統資源的分配以及回收,導致多程序的開銷明顯大於多執行緒的開銷。

兩者的應用場景

對CPU密集型程式碼(比如迴圈計算) - 多程序效率更高

對IO密集型程式碼(比如檔案操作,網路爬蟲) - 多執行緒效率更高

理由:對於IO密集型操作,大部分消耗時間其實是等待時間,在等待時間中CPU是不需要工作的,那你在此期間提供雙CPU資源也是利用不上的,相反對於CPU密集型程式碼,2個CPU幹活肯定比一個CPU快很多。那麼為什麼多執行緒會對IO密集型程式碼有用呢?這時因為python碰到等待會釋放GIL供新的執行緒使用,實現了執行緒間的切換。

到此這篇關於python多執行緒和多程序關係詳解的文章就介紹到這了,更多相關python多執行緒和多程序之間的聯絡內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!