为什么子进程运行其父进程的代码以及如何防止它?

2024-05-17 13:35:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个主类,它产生了许多子进程,这些子进程是多处理过程然后进入一个无限循环,等待进程被信号中断。在

它是从一个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'

有人能解释一下为什么子进程要运行父进程的代码,以及我如何在主进程中捕捉到适当的信号并清理工作进程


Tags: toimportinfononeforsignal信号进程
1条回答
网友
1楼 · 发布于 2024-05-17 13:35:33

在Unix(我假设您是这样的操作系统)中,新进程的创建是通过分叉当前正在运行的进程来实现的。在

新创建的进程(更简单地说是子进程)将继承父进程的所有文件描述符和信号处理程序。在

这意味着在您的示例中,父进程和子进程将以相同的方式处理传递的SIGTERM信号。在

在一些实现中,signals will be delivered to process groups因此导致两个进程接收相同的信号。在

要解决您的特定问题,只需在生成子进程之后在父进程中安装信号处理程序。在

相关问题 更多 >