Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的信号处理_Python_Multithreading_Signals - Fatal编程技术网

Python中的信号处理

Python中的信号处理,python,multithreading,signals,Python,Multithreading,Signals,在我的程序中,我有一堆线程在运行,我正在尝试 中断主线程以使其异步执行某些操作。 因此,我设置了一个处理程序,并向主进程发送一个SIGUSR1-请参阅代码 下: 在上述情况下,所有线程和主进程都会停止-从“c”开始 从观点上看,这是出乎意料的-我希望线程在运行时继续运行 在信号之前。如果我把信号放进去,一切都会继续 好的 谁能告诉我怎么做?也许我得对“框架”做点什么 手动返回到原来的位置……不过只是猜测而已 提前感谢, 谢谢你在这方面的帮助 为了进一步解释,我让线程实例将字符串信息写入 输出到

在我的程序中,我有一堆线程在运行,我正在尝试 中断主线程以使其异步执行某些操作。 因此,我设置了一个处理程序,并向主进程发送一个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)]