Python中的信号处理
在我的程序中,我有一堆线程在运行,我正在尝试 中断主线程以使其异步执行某些操作。 因此,我设置了一个处理程序,并向主进程发送一个SIGUSR1-请参阅代码 下: 在上述情况下,所有线程和主进程都会停止-从“c”开始 从观点上看,这是出乎意料的-我希望线程在运行时继续运行 在信号之前。如果我把信号放进去,一切都会继续 好的 谁能告诉我怎么做?也许我得对“框架”做点什么 手动返回到原来的位置……不过只是猜测而已 提前感谢,Python中的信号处理,python,multithreading,signals,Python,Multithreading,Signals,在我的程序中,我有一堆线程在运行,我正在尝试 中断主线程以使其异步执行某些操作。 因此,我设置了一个处理程序,并向主进程发送一个SIGUSR1-请参阅代码 下: 在上述情况下,所有线程和主进程都会停止-从“c”开始 从观点上看,这是出乎意料的-我希望线程在运行时继续运行 在信号之前。如果我把信号放进去,一切都会继续 好的 谁能告诉我怎么做?也许我得对“框架”做点什么 手动返回到原来的位置……不过只是猜测而已 提前感谢, 谢谢你在这方面的帮助 为了进一步解释,我让线程实例将字符串信息写入 输出到
谢谢你在这方面的帮助 为了进一步解释,我让线程实例将字符串信息写入 输出到文件的套接字。这些线程运行自己的计时器,因此 独立地将其输出写入套接字。当程序运行时,我也会看到 它们的输出在stdout上,但当我从信号中看到调试行时,它就停止了 我需要线程不断发送此信息,但我需要主程序 接受一个命令,使它也开始做其他事情(并行)一段时间。
我想我可以从命令行发送一个信号来触发它。混合信号和线程总是有点不稳定。然而,你所描述的不应该发生。Python只处理主线程中的信号。如果操作系统将信号传递给另一个线程,该线程可能会短暂中断(当它执行系统调用时),但它不会执行信号处理程序。主线程将被要求在下一次机会执行signalhandler
当您发送信号时,您的线程(包括主线程)实际上在做什么?你怎么注意到他们都“停止”了?这是一个短暂的暂停(因为主线程在处理信号之前需要获取GIL这一事实很容易解释),还是进程完全崩溃了?您可能应该使用threading.Condition变量,而不是发送信号。让主线程在每个循环中检查它,如果设置了,则执行其特殊操作
如果您坚持使用信号,您将希望使用子进程而不是线程,因为您的问题可能是由于GIL造成的。我将大致回答我自己的问题: 在我的第一次尝试中,我主要使用time.sleep(运行时间) 线程来控制线程运行到停止的时间。加入 调试我可以看到,睡眠循环似乎是退出一旦 信号处理程序返回,所以一切正常但很早就关闭了 我已经用一个while循环代替了睡眠,之后就不会跳出来了 信号处理程序返回,因此我的线程继续运行。所以它解决了这个问题
问题,但我仍然对sleep()的行为感到有点困惑。请观看David Beazley的演示 它还解释了一些与线程和信号相关的古怪行为(特定于Python,而不是主题的一般古怪之处:-))
Pyprocessing是一个整洁的库,它使Python中的单独进程更容易使用。“所有线程和主进程都停止”您的意思是进程被终止了吗?它崩溃了吗?在单线程程序中执行上述步骤,然后
killall-usr1python
成功了,顺便说一句,演示文稿已从blip中删除。你有书名吗,等等,这样我们可以找到另一本吗?@spazm,谷歌搜索了一下“david beazley信号处理python”。我不再喜欢Python了,但我敢打赌大卫·比兹利的其他视频也值得一看或两看。玩得高兴[编辑:语法]
def SigUSR1Handler(signum, frame):
self._logger.debug('Received SIGUSR1')
return
signal.signal(signal.SIGUSR1, SigUSR1Handler)
[signal.signal(signal.SIGUSR1, signal.SIG_IGN)]