8

围绕 Python 线程的规则是什么以及如何处理 Unix 信号?

是由 Python 运行时KeyboardInterrupt触发SIGINT但在内部处理的,处理方式不同吗?

4

2 回答 2

9

首先,在使用模块设置信号处理程序时signal,您必须在主线程中创建它们。如果您尝试在单独的线程中创建它们,您将收到异常。

通过该函数注册的信号处理程序signal.signal()将始终在主线程中调用。在支持向线程发送信号的架构上,在 C 级别,我相信 Python 运行时会忽略线程上的所有信号,并且在主线程上有一个信号处理程序,它用于分派给你的 Python 代码信号处理程序。

thread模块的文档声明KeyboardInterrupt异常(通常由 触发SIGINT)可以传递到任意线程,除非您拥有signal所有 Unix 系统都应该拥有的模块。在这种情况下,它被传递到主线程。如果您在没有 的系统上signal,则必须KeyboardInterrupt在线程中捕获并调用thread.interrupt_main()以在主线程中重新引发它。

更多信息可以在 Python 文档中找到threadsignal模块。

于 2009-07-27T16:21:02.707 回答
4

signal文档中:

如果在同一个程序中同时使用信号和线程,则必须小心。同时使用信号和线程时要记住的基本事项是:始终在执行signal()的主线程中执行操作。任何线程都可以执行alarm(), getsignal(), pause(), setitimer()or getitimer(); 只有主线程可以设置新的信号处理程序,并且主线程将是唯一接收信号的线程(这是由 Python 信号模块强制执行的,即使底层线程实现支持向单个线程发送信号)。这意味着信号不能用作线程间通信的手段。改用锁。

于 2009-07-27T16:11:52.040 回答