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開始執行的時候才調用。解決了此問題