Python中的信号处理

2024-04-27 11:17:00 发布

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

在我的程序中,我有很多线程在运行,我正在尝试 中断主线程以使其异步执行某些操作。 所以我设置了一个处理程序,并向主进程发送一个SIGUSR1-请参见代码 下表:

def SigUSR1Handler(signum, frame):

    self._logger.debug('Received SIGUSR1')

    return

signal.signal(signal.SIGUSR1, SigUSR1Handler)

[signal.signal(signal.SIGUSR1, signal.SIG_IGN)]

在上面的例子中,所有的线程和主进程都从“c”停止 从观点来看这是意外的-我希望线程继续 在信号之前。如果我把信号放进去,一切都会继续 好的。

有人能告诉我怎么做吗?也许我得用这个“框架”做点什么 手动回到原来的位置..只是猜测而已 提前谢谢你


谢谢你在这方面的帮助。

为了进一步解释,我有线程实例将字符串信息写入 同时输出到文件的套接字。这些线程运行自己的计时器,因此 独立地将输出写入套接字。当程序运行时,我也看到 它们的输出在stdout上,但当我看到来自信号的调试行时,它就停止了。

我需要线程不断发送此信息,但我需要主程序 接受一个命令,这样它也会开始做一些其他的事情(并行)一段时间。 我以为我能从命令行发送一个信号来触发这个。


Tags: 代码self程序信息处理程序signal信号进程
3条回答

混合信号和线程总是有点不稳定。然而,你所描述的不应该发生。Python只处理主线程中的信号。如果操作系统将信号传递给另一个线程,则该线程可能会短暂中断(例如,当它执行系统调用时),但它不会执行信号处理程序。主线程将被要求在下一次机会时执行信号处理程序。

当您发送信号时,您的线程(包括主线程)实际上在做什么?你怎么注意到他们都“停”了?是短暂的停顿(很容易解释为主线程在处理信号之前需要获取GIL)还是进程完全崩溃?

我会回答我自己的问题: 在我的第一次尝试中,我使用了时间。睡眠(运行时间)在主要 线程来控制线程在停止之前运行的时间。通过添加 调试我可以看到睡眠循环似乎在 信号处理程序返回,所以一切正常但很早就关闭了!

我已经用一个while循环替换了睡眠,它在 信号处理程序返回,所以我的线程继续运行。所以它解决了 但我对睡眠的行为还是有点困惑。

您可能应该使用threading.Condition变量而不是发送信号。让你的主线程检查它的每个循环,并执行它的特殊操作,如果它已经设置。

如果您坚持使用信号,那么您将希望使用子流程而不是线程,因为您的问题可能是由于GIL造成的。

相关问题 更多 >