2012-01-12 65 views
1

最近在一個項目中,我有一個多處理進程崩潰。一個子進程應該進行計算,然後將其發送到Pipe中的父進程。如果孩子墜毀,父母會在從管道讀取時凍結。是否有一種「正確的」方式發送數據,避免兒童死亡時永遠阻止父母?使用多處理處理死進程。管道

這是再現時遇到的問題的例子:

import multiprocessing as mp 

def f(pipe): 
    a = 1/0 
    pipe.send('hola') 

parent, child = mp.Pipe() 

proc = mp.Process(target=f, args=(child,)) 

proc.start() 

print "Grabbing result" 
print "Result: {0}".format(parent.recv()) 

proc.join() 

回答

0

父進程可以使用連接的poll(...)方法來確定是否有任何結果即將有一個合理的時間限制:

import multiprocessing as mp 

timelimit = 3 

def f(pipe): 
    a = 1/0 
    pipe.send('hola') 

parent, child = mp.Pipe() 

proc = mp.Process(target=f, args=(child,)) 

proc.start() 

print "Grabbing result" 
if parent.poll(timelimit): 
    print "Result: {0}".format(parent.recv()) 
else: 
    print "No data available after {0} seconds...".format(timelimit) 

proc.join() 

當我運行這段代碼我得到如下結果:

Grabbing result 
Process Process-1: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap 
    self.run() 
    File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "s.py", line 6, in f 
    a = 1/0 
ZeroDivisionError: integer division or modulo by zero 
No data available after 3 seconds... 
+0

嗯,這是一個體面的解決方案,但我希望有一個更好的方法來檢測崩潰,尤其是可能長時間運行的計算過程。 – Belly 2012-03-13 22:28:46