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

2022-09-29 06:00:15 字數 1591 閱讀 7679

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

多程序是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 多執行緒 和 多程序

單執行緒例子 usr bin python coding utf 8 name danxiancheng.py import time import threading def loop num,sec print loop s start num,time.strftime y m d h m s...

python多執行緒和多程序

pool 感謝多執行緒和多程序最大的不同在於,多程序中,同乙個變數,各自有乙份拷貝存在於每個程序中,互不影響 而多執行緒中,所有變數都由所有執行緒共享,所以,任何乙個變數都可以被任何乙個執行緒修改,因此,執行緒之間共享資料最大的危險在於多個執行緒同時改乙個變數,把內容給改亂了。python中,多執行...

多程序和多執行緒python

coding utf8 import threading import time class mop floor threading.thread def init self super mop floor,self init def run self print 我要拖地了 time.sleep ...