python subprocess 和 multiprocess選擇以及我遇到的坑


The subprocess option:

subprocess is 用來執行其他的可執行程序的,即執行外部命令。 他是os.fork() 和 os.execve() 的封裝。 他啟動的進程不會把父進程的模塊加載一遍。使用subprocess的通信機制比較少,通過管道或者信號機制.

The multiprocessing option:

multiprocessing 用來執行python的函數,他啟動的進程會重新加載父進程的代碼。可以通過Queue、Array、Value等對象來通信。

 

一個坑:

我今天遇到一個問題,A進程用subprocess啟動進程B,B進程用multiprocess啟動進程C,C進程用subprocess啟動D。其中A和B有導入的依賴,就是說B導入的時候會導入一個包(執行__init__.py),這個包A也會導入。

我在__init__.py初始化了全局的資源,在B內部導入的模塊也有初始化全局資源的操作。

啟動結果是A進程啟動正常;B進程啟動的時候,執行了A的資源初始化(資源浪費問題);C進程啟動的時候執行了B的資源初始化;D進程啟動正常。

我一直在思考,為什么B會執行A的,C會執行B的?最終我發現,是因為AB共同導入了一個包,這個包下__init__.py執行了初始化,根據python的導入機制,AB都會初始化全局資源。

那為啥C啟動的時候會執行B的全局初始化呢?C進程是執行一個py文件,沒有任何B相關的依賴,其僅依賴獨立的模塊。我后來將B的全局初始化放入函數(根據導入模塊機制,這樣在模塊被加載的時候不會執行這個代碼),發現C不會再執行B的初始化代碼。

這里的結論是:用multiprocess啟動的進程會將父進程加載過的模塊重新加載一遍,導致C初始化了B的全局資源,最后我將B的全局資源放到函數內初始化,main開始執行的時候才調用。解決了此問題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM