2009-10-26 37 views
2

主要程序是這樣的:執行和監控外部程序的多個實例在Python

PREPARE PARAMETERS FOR CHILD PROCESSES 
subprocess.Popen('python child.py param=example1'.split(' ')) 
subprocess.Popen('python child.py param=example2'.split(' ')) 
... 

如何使主程序監視它啓動子進程的每個實例和其相應的參數重新啓動它,如果它不是運行。

保持多個子進程實例運行而不是在主進程中實現多線程架構的目的是儘可能多地利用CPU和數據庫吞吐量。

回答

5

將子進程的.pid作爲鍵保留字典,並將命令行重新啓動爲相應的值。即:

childid = [] 
for cmdline in cmdlines: 
    p = subprocess.Popen(cmdline.split()) 
    childid[p.pid] = cmdline 

os.wait將返回當任何子進程終止:它可以讓你的孩子(PID,退出狀態)。所以只需重新啓動並保持childid。即:

while mustcontinue: 
    pid, exitstat = os.wait() 
    cmdline = childid.pop(pid) 
    p = subprocess.Popen(cmdline.split()) 
    childid[p.pid] = cmdline 

想必你當這無限循環結束對一些標準,我只是用mustcontinue的名稱爲這些標準在這裏;-)。