Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Fork和ignore子退出状态_Python_Linux_Posix - Fatal编程技术网

Python Fork和ignore子退出状态

Python Fork和ignore子退出状态,python,linux,posix,Python,Linux,Posix,当前正在编写自动更新多个长时间运行的程序的守护进程时。我不关心程序的退出状态,因为孩子退出的唯一方式是在升级时强制退出。不幸的是,我因此创建了大量僵尸进程 我知道我可以使用waitpid(0,WNOHANG)来监听任何子级的更改(这几乎正是我想要的),但是我也使用python多处理模块并行运行多个单独的升级过程,因此,我可以从中运行的长时间运行的进程实际上是终止进程的祖父母,因此它从不接收任何信号 那么,是否有任何方法可以分叉子进程,这样我就不需要检查退出状态,或者我只需要处理我的进程表中充满了

当前正在编写自动更新多个长时间运行的程序的守护进程时。我不关心程序的退出状态,因为孩子退出的唯一方式是在升级时强制退出。不幸的是,我因此创建了大量僵尸进程

我知道我可以使用
waitpid(0,WNOHANG)
来监听任何子级的更改(这几乎正是我想要的),但是我也使用python多处理模块并行运行多个单独的升级过程,因此,我可以从中运行的长时间运行的进程实际上是终止进程的祖父母,因此它从不接收任何信号


那么,是否有任何方法可以分叉子进程,这样我就不需要检查退出状态,或者我只需要处理我的进程表中充满了僵尸?

您应该能够通过设置SIGCHLD的信号处理程序来控制这一点

在C中,您将使用:

signal(SIGCHLD, SIG_IGN);
您需要将其适应Python接口

您可以使用Python2或Python3模块;对于手头的问题,它们似乎是相同的:

import signal

signal.signal(signal.SIGCHLD, signal.SIG_IGN)
请参阅:POSIX了解基本系统行为(特别是该部分下的“信号动作”和
SIG_IGN


警告:Python代码未经过正式测试

您应该能够通过设置SIGCHLD的信号处理程序来控制这一点

在C中,您将使用:

signal(SIGCHLD, SIG_IGN);
您需要将其适应Python接口

您可以使用Python2或Python3模块;对于手头的问题,它们似乎是相同的:

import signal

signal.signal(signal.SIGCHLD, signal.SIG_IGN)
请参阅:POSIX了解基本系统行为(特别是该部分下的“信号动作”和
SIG_IGN


警告:Python代码未经过正式测试

据我所知,您的流程树布局如下所示,其中
parent1
parent2
是使用Python的
多处理.process
对象的东西

grandparent
 |- parent1
   |- child1
   |- child2
 |- parent2
   | - child1
   | - child2
如果是这种情况,您需要确保从父进程(即,
parent1
parent2
)对其各自的子进程调用
multiprocessing.Process.join
。一旦他们终止,不管原因如何,他们都将被清理,这将允许
祖父母
优雅地清理
父母1
父母2


如果您想向父进程添加额外的逻辑来循环所有子进程,而不是阻塞第一个进程,则可以使用在中提到的
超时
kwarg来超时加入。

据我所知,进程树布局如下所示,其中
parent1
parent2
是使用Python的
多处理.Process
对象的东西

grandparent
 |- parent1
   |- child1
   |- child2
 |- parent2
   | - child1
   | - child2
如果是这种情况,您需要确保从父进程(即,
parent1
parent2
)对其各自的子进程调用
multiprocessing.Process.join
。一旦他们终止,不管原因如何,他们都将被清理,这将允许
祖父母
优雅地清理
父母1
父母2

如果您想向父进程添加额外的逻辑,以循环所有子进程,而不是阻塞第一个进程,则可以使用在中提到的
timeout
kwarg来超时加入