使用multiprocessing.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()
1 个回答
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...