天天看點

python多程序的了解 multiprocessing Process join run

最近看了下多程序。

一種接近底層的實作方法是使用

os.fork()方法,fork出子程序。但是這樣做事有局限性的。比如windows的os子產品裡面沒有 fork()

方法。

windows:

python多程式的了解 multiprocessing Process join run

。linux:

python多程式的了解 multiprocessing Process join run

另外還有一個子產品:subprocess。這個沒整過,但從vamei的部落格裡看到說也同樣有局限性。

是以直接說主角吧 --- multiprocessing子產品。

multiprocessing子產品會在windows上時模拟出fork的效果,可以實作跨平台,是以大多數都使用multiprocessing。

下面給一段簡單的代碼,示範一下建立程序:

執行結果:

python多程式的了解 multiprocessing Process join run

上面提到了兩個方法:run 和join

run:如果在建立process對象的時候不指定target,那麼就會預設執行process的run方法:

另:python源碼裡,process.run方法:

python多程式的了解 multiprocessing Process join run
python多程式的了解 multiprocessing Process join run

可見如果在執行個體化process時不指定target,就會執行預設的run方法。

還有一個join方法:

最上面示範的代碼中,在調用process的start方法後,調用了兩次join方法。這個join方法是幹什麼的呢?

官方文檔的意思是:阻塞目前程序,直到調用join方法的那個程序執行完,再繼續執行目前程序。

比如還是剛才的代碼,隻是把兩個join注釋掉了:

 執行結果:

python多程式的了解 multiprocessing Process join run

 發現主程序不像之前那樣,等待兩個子程序執行完了,才繼續執行。而是啟動兩個程序後立即向下執行。

為了深刻了解,這次把p2的執行函數裡面睡眠時間調大,讓他多睡一會,然後保留p1的join,注釋掉p2的join,效果更明顯:

python多程式的了解 multiprocessing Process join run

發現主線程隻是等待p1完成了,就會向下執行,而不會等待p2是否完成。

 是以使用多程序的正常方法是,先依次調用start啟動程序,再依次調用join要求主程序等待子程序的結束。

然而為什麼要先依次調用start再調用join,而不是start完了就調用join呢,如下:

由:

改為:

執行效果:

python多程式的了解 multiprocessing Process join run

 發現是先執行完p1,再執行主線程,最後才開始p2。

今天上午一直困惑這個事,現在終于明白了。join是用來阻塞目前線程的,p1.start()之後,p1就提示主線程,需要等待p1結束才向下執行,那主線程就乖乖的等着啦,自然沒有執行p2.start()這一句啦,當然就變成了圖示的效果了。