如何避免Linux中已失效的python进程?
使用Ubuntu 14.04上的python3(3.4.3),我创建了一个如何避免Linux中已失效的python进程?,python,linux,python-3.x,Python,Linux,Python 3.x,使用Ubuntu 14.04上的python3(3.4.3),我创建了一个Forker类,我在两个不同的进程中使用它来创建子进程。以下是Forker类: class Forker(object): def __init__(self): self.active_children = [] def reap_children(self): while se
Forker
类,我在两个不同的进程中使用它来创建子进程。以下是Forker
类:
class Forker(object):
def __init__(self):
self.active_children = []
def reap_children(self):
while self.active_children:
pid,stat = os.waitpid(0, os.WNOHANG)
if not pid: break
self.active_children.remove(pid)
def fork(self, function, *args, **kwargs):
self.reap_children()
child_pid = os.fork()
if child_pid == 0:
function(*args, **kwargs)
os._exit(0)
else:
self.active_children.append(child_pid)
return child_pid
在两个不同的Linux进程中,我从这个类派生,然后调用,例如:
self.fork(my_function, my_data)
但是,我仍然有几个已失效的python进程:
alexand+ 24777 24735 0 20:40 pts/29 00:00:00 [python3] <defunct>
alexand+ 24838 24733 0 20:40 pts/29 00:00:00 [python3] <defunct>
alexand+2477247350 20:40分/29 00:00:00[蟒蛇3]
alexand+24838247330 20:40分/29 00:00:00[蟒蛇3]
也许我可以改变一些东西来避免这些失效的进程?退出的子进程在父进程等待它们之前都是
。
由于您仅在fork()
一个新子项时才调用wait ineaw_children()
,因此退出的子项将一直保留
,直到下一个子项被分叉。要更早地摆脱它们,您可以在更早的时间调用eaw_children()
(即等待)。通常,这是通过SIGCHLD信号的处理程序完成的。标记为
的进程称为僵尸进程。系统将它们保持在失效状态,以允许它们的父级在完成运行后读取它们的状态
有两种方法可以删除它们:
- 完成后不久,在来电者中等待他们。调用方可以为SIGCHLD设置一个处理程序,以警告它的一个子项刚刚结束,或者只是不时轮询它们
- 别理他们。如果调用方在fork时间明确忽略SIGCHLD(
),则将立即删除子项(无失效状态),但父项无法再等待它们signal(SIGCHLD,SIG_IGN);
Popen.wait()
在这种情况下不再工作?它是否在内部使用signal.sigwait([signal.SIGCHLD])
?@balu是的,因为这是底层操作系统允许的方式。