我有一个主类,它产生了许多子进程,这些子进程是多处理过程然后进入一个无限循环,等待进程被信号中断。在
它是从一个u main_uu.py文件开始的,如下所示:
from module a import A
import signal
a = A()
def graceful_exit(signal=None, frame=None):
a.stop()
signal.signal(signal.SIGTERM, graceful_exit)
try:
write_pidfile(pid)
a.start()
finally:
graceful_exit()
类的主启动过程如下所示:
^{pr2}$工人没有做什么特别的事,只是在一个无限循环中进行一些无意识的工作。在
然后是停止方法:
def stop(self):
log.info('waiting for workers to finish')
for w in self.workers:
w.terminate()
现在的问题是,只要主进程接收到信号(SIGTERM或SIGINT),我就会得到以下输出:
2016-04-26 12:53:04,651 MainProcess gateway INFO waiting for workers to finish
2016-04-26 12:53:04,653 Worker-1 gateway INFO waiting for workers to finish
2016-04-26 12:53:04,654 Worker-1 gateway INFO waiting for workers to finish
因此:
AttributeError: 'NoneType' object has no attribute 'terminate'
有人能解释一下为什么子进程要运行父进程的代码,以及我如何在主进程中捕捉到适当的信号并清理工作进程
在Unix(我假设您是这样的操作系统)中,新进程的创建是通过分叉当前正在运行的进程来实现的。在
新创建的进程(更简单地说是子进程)将继承父进程的所有文件描述符和信号处理程序。在
这意味着在您的示例中,父进程和子进程将以相同的方式处理传递的SIGTERM信号。在
在一些实现中,signals will be delivered to process groups因此导致两个进程接收相同的信号。在
要解决您的特定问题,只需在生成子进程之后在父进程中安装信号处理程序。在
相关问题 更多 >
编程相关推荐