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

Python 为什么子进程运行其父进程的代码,以及如何防止它?,python,multiprocessing,signals,Python,Multiprocessing,Signals,我有一个主类,它产生了许多子进程,这些子进程是multiprocessing.Process的子类,然后进入一个无限循环,等待进程被信号中断 它是从一个_umain__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_exi

我有一个主类,它产生了许多子进程,这些子进程是multiprocessing.Process的子类,然后进入一个无限循环,等待进程被信号中断

它是从一个_umain__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()
def start(self):
    # some initialization
    for i in range(self.num_workers):
        worker = Worker()
        self.workers.append(worker)
        worker.start()
    for w in self.workers:
        w.join()
主类的启动过程如下所示:

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()
def start(self):
    # some initialization
    for i in range(self.num_workers):
        worker = Worker()
        self.workers.append(worker)
        worker.start()
    for w in self.workers:
        w.join()
工人没有做任何特殊的事情,只是在一个无限循环中运行一些无意识的工作

然后是停止方法:

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信号

在几个实现中,从而导致两个进程接收相同的信号

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