繁体   English   中英

使用multiprocessing.Pipe处理死进程

[英]Dealing with dead processes using multiprocessing.Pipe

最近在一个项目中,我的一个多处理流程崩溃了。 应该由子进程进行计算,然后将其发送到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()

父进程可以使用连接的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...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM