为啥 multiprocessing.Process 没有 send_signal 方法?

Posted

技术标签:

【中文标题】为啥 multiprocessing.Process 没有 send_signal 方法?【英文标题】:Why multiprocessing.Process doesn't have a send_signal method?为什么 multiprocessing.Process 没有 send_signal 方法? 【发布时间】:2021-09-13 09:53:50 【问题描述】:

与 subprocess.Popen 不同,multiprocessing.Process 没有 send_signal 方法。为什么?是否有推荐的方法将 SIGINT 等信号发送到 multiprocessing.Process?我应该为此目的使用 os.kill() 吗?提前致谢。

【问题讨论】:

【参考方案1】:

您的第一个问题完全有道理。 我认为那是因为multiprocessingsubprocess 库有不同的设计目标(正如this answer 所解释的):前者是为了使多个Python 脚本在不同的CPU 上协作以实现共同任务,而后者用于将外部程序集成到您的 Python 程序中。因为 IPC(进程间通信)在协作的 Python 多进程之间要容易得多(有queues and pipes,您可以将 Python 对象作为参数传递,...)比我们只能假设遵守 OS 接口的外部程序要容易得多(文本 stdin/stdout应该正确处理信号,...)。 因此,与另一个多进程通信的默认方式不是操作系统信号,因此集成它被认为没有用。 还要记住,(C)Python 是开源的,所以你可以自己贡献这个集成。

至于你的第二个问题,已经有答案了(cf How can I send a signal from a python program?),是的:

使用os.kill()

【讨论】:

感谢您的回答。不久前我也得出了同样的结论。但是 os.kill() 的部分是我担心的。我认为这是另一个抽象层次。我可以确定如果我使用 os.kill() 进行 multiprocessing.Process 一切都会好起来的(如果进程已将信号与函数相关联)? @Rais 进程是使用subprocess 还是multiprocess 启动的,对于操作系统来说它看起来完全一样,并且进程应该遵守相同的规则(适当地处理信号)。唯一的问题可能是守护进程、终止子进程、非等待子进程……通常的编程建议适用于此,没有什么不同。它始终只是常规的操作系统内容。你说得对,os.kill 是操作系统级别的功能,与应用程序(业务)不在一个级别,但据我所知没有好的替代解决方案。

以上是关于为啥 multiprocessing.Process 没有 send_signal 方法?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 glTranslatef?为啥不直接更改渲染坐标?

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?