Python 当子进程被发送信号时,父进程在后续读取()时接收键盘中断

Python 当子进程被发送信号时,父进程在后续读取()时接收键盘中断,python,python-3.x,python-multiprocessing,Python,Python 3.x,Python Multiprocessing,在MacOS上使用Python 3.7: 我有一个多处理池,子进程在其中处理工作单元 反过来,这些池子进程中的每个都必须运行一个命令子进程,这是使用Popen完成的;例如: 使用Popen[CMD,ARGS],stdin=PIPE,stdout=PIPE,stderr=stdout,encoding='utf8',close\u fds=True,cwd=JSBOT\u DIR,start\u new\u session=True,作为进程: 尝试: 当process.poll为“无”时: 就绪

在MacOS上使用Python 3.7:

我有一个多处理池,子进程在其中处理工作单元

反过来,这些池子进程中的每个都必须运行一个命令子进程,这是使用Popen完成的;例如:

使用Popen[CMD,ARGS],stdin=PIPE,stdout=PIPE,stderr=stdout,encoding='utf8',close\u fds=True,cwd=JSBOT\u DIR,start\u new\u session=True,作为进程: 尝试: 当process.poll为“无”时: 就绪,错误=选择[进程],[进程],超时 如果进程未就绪: line=进程\标准输出。readline while line: LOGGER.infof'{line.rstrip}' line=进程\标准输出。readline 除键盘中断外: LOGGER.info“从子进程获取键盘中断” ... 过程10 此命令子进程可能会通过向其发送SIGUSR2来发出结束和退出的信号

完成此命令子流程后,将进行一些后期处理。这是使用池子级中的subprocess.run实现的,例如:

结果=子进程。运行['ffmpeg','-y','-i',路径名,'-ac',1','-ar',48000','-c:a',pcm_s16le', 标准化的_文件名],stderr=STDOUT,STDOUT=PIPE 我遇到的问题是,在subprocess.run执行后,Python立即发出键盘中断,池子级立即死亡:

文件/usr/local/ceral/python/3.7.3/Frameworks/python.framework/Versions/3.7/lib/python3.7/subprocess.py,第474行,正在运行 stdout,stderr=process.communicateinput,timeout=timeout 文件/usr/local/ceral/python/3.7.3/Frameworks/python.framework/Versions/3.7/lib/python3.7/subprocess.py,第926行,在communicate中 stdout=self.stdout.read 键盘中断 我已尝试将SIGUSR2和SIGINT设置为确保在子进程初始化期间在池子进程中被忽略;然而,这并没有帮助。我也尝试过使用和不使用start\u new\u session=True。我还尝试将SIGINT设置为在池子级中处理,但发生这种情况时不会调用处理程序。如果我故意向池子级发送SIGINT,则会调用该处理程序

如果我在尝试创建下一个进程之前将进程设置为time.sleep10,它将完全休眠,然后立即认为在subprocess.run中的第一次读取时键盘中断已经到达

这种行为似乎是这样的,即向池子进程的命令子进程发送信号会使Python认为已向池子进程发送了键盘中断,并且在第一次IO尝试时处理该键盘中断

我的问题是:为什么会发生这种情况(即,我错过了什么?),以及如何防止这种情况发生

我还注意到,当Popened命令终止时,我在命令子进程上下文中捕获并记录了一个键盘中断。这可能是口译员“记住”有一个挂起的键盘中断的情况,而这个中断后来会被处理吗?如果是这样,我该如何抑制或“清除”键盘中断


编辑:当我继续处理这个问题时,我发现如果我注释掉所有select/readline/log循环,一切都会正常工作。因此,这似乎是从命令子进程中读取某些内容,从而杀死池子进程。

使用Popen[CMD,ARGS]运行时。。。在多处理池中,对吗?您是否尝试过在主功能/主进程内处理键盘中断?这是正确的。一个游泳池工人正在给波本打电话。主进程从未看到键盘中断,但池工作者被它杀死。明天,我将添加一些回溯,以查看键盘中断在池工作者中的起始位置。它必须来自poll、select或readline,并且必须在弹出的进程退出时生成。今天我带着一个计划来到这里,想真正弄清这一点,但它神秘地停止了发生!昨晚100%的时间都在发生,但今天0%的时间都在发生,没有任何干预性的代码更改。。。在多处理池中,对吗?您是否尝试过在主功能/主进程内处理键盘中断?这是正确的。一个游泳池工人正在给波本打电话。主进程从未看到键盘中断,但池工作者被它杀死。明天,我将添加一些回溯,以查看键盘中断在池工作者中的起始位置。它必须来自poll、select或readline,并且必须在弹出的进程退出时生成。今天我带着一个计划来到这里,想真正弄清这一点,但它神秘地停止了发生!事情发生在10点钟 昨晚0%的时间发生,但今天0%的时间发生,没有任何干预代码更改。