我有一个用Python编写的线程应用程序,每当通过Ctrl+C或有时使用kill 接收到中断时,应用程序将挂起.从一个线程呈现堆栈跟踪,但应用程序仍保留在前台,我通常必须使用Ctrl+Z对其进行后台处理,然后尝试将其删除.
在线程应用程序中处理信号和键盘中断的正确方法是什么?
在Python中讨论信号处理程序和使用Python登录哪些函数在Python中可重入的问题.
该信号库提:
尽管就Python用户而言,Python信号处理程序是异步调用的,但它们只能出现在Python解释器的原子指令之间.这意味着在纯C中实现的长计算期间到达的信号(例如大文本上的正则表达式匹配)可能会延迟一段任意时间.
日志库指出了重新入口不典型的情况:
如果使用信号模块实现异步信号处理程序,则可能无法在此类处理程序中使用日志记录.这是因为线程模块中的锁实现并不总是可重入的,因此不能从这样的信号处理程序中调用.
我有点困惑,因为信号库将GIL(全局解释器锁)称为"..原子指令之间......".在这种情况下,一旦GIL离开/ 解锁,信号就被推迟并执行.一种信号队列.
这是有道理的,但延迟信号处理程序调用的函数是否可重入是无关紧要的,因为它们不是在具有"重入"限制的真实 POSIX信号处理程序中调用的:
只有定义的POSIX C函数列表被声明为可重入,并且可以在POSIX信号处理程序中调用.IEEE Std 1003.1列出了您在https://www.opengroup.org/找到的118个可重入的UNIX函数(需要登录).