使用multiprocessing.Pipe处理死掉的进程

1 投票
1 回答
1274 浏览
提问于 2025-04-17 10:04

最近在一个项目中,我遇到了一个多进程的问题。一个子进程本来是要进行计算,然后把结果通过管道发送给父进程。如果子进程崩溃了,父进程在读取管道时就会卡住,无法继续运行。有没有什么“正确”的方法可以发送数据,这样即使子进程崩溃,父进程也不会一直被卡住呢?

下面是一个示例,展示了我遇到的问题:

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...

撰写回答