繁体   English   中英

Python中的信号处理

[英]Signal handling in 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'的角度来看这是出乎意料的 - 我希望线程在信号之前继续。 如果我改为使用SIG_IGN,一切都会继续。

有人能告诉我怎么做吗? 也许我必须手动对“框架”做一些事情才能回到原来的位置..只是提前猜一下,


感谢您的帮助。

为了解释一下,我有线程实例将字符串信息写入套接字,该套接字也输出到文件。 这些线程运行自己的定时器,因此它们独立地将输出写入套接字。 当程序运行时,我也在stdout上看到它们的输出,但是一旦我从信号中看到调试行,它就会全部停止。

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

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

当你发送信号时,你的线程(包括主线程)实际上做了什么? 你怎么注意到他们都“停止”了? 这是一个短暂的暂停(很容易通过主线程在处理信号之前需要获取GIL的事实来解释)还是整个过程中断了?

我会整理的回答我的问题:在我第一次尝试在此我使用time.sleep(RUN_TIME)在主线程控制线程多长时间奔跑,直到他们被停止。 通过添加调试,我可以看到,一旦信号处理程序返回,睡眠循环似乎就会退出,所以一切都正常关闭但是提前关闭!

我用while循环替换了sleep,并且在信号处理程序返回后没有跳出来,所以我的线程继续运行。 所以它解决了这个问题,但我仍然对sleep()的行为感到困惑。

您应该使用threading.Condition变量而不是发送信号。 让主线程在每个循环中检查它并执行其特殊操作(如果已设置)。

如果你坚持使用信号,你会想要使用子进程而不是线程,因为你的问题可能是由于GIL。

观看David Beazley的演讲。

http://blip.tv/file/2232410

它还解释了一些与线程和信号相关的古怪行为(特定于Python,而不是主题的一般怪癖:-))。

http://pyprocessing.berlios.de/ Pyprocessing是一个简洁的库,可以更轻松地使用Python中的单独进程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM