信号处理程序和Python中的日志记录

Dim*_*nko 10 python logging signals

日志模块的文档说明了这一点

如果使用信号模块实现异步信号处理程序,则可能无法在此类处理程序中使用日志记录.这是因为线程模块中的锁实现并不总是可重入的,因此不能从这样的信号处理程序中调用.

这表明不应该直接或间接地从信号处理程序调用的代码中进行日志记录调用.如果你偶尔执行一次程序,那么只剩下kill -9有帮助的状态.

现在重要的问题是如下.当其他线程主线程处理信号调用日志记录方法时,是否也会发生此锁定问题?

Rap*_*sek 9

信号处理程序在UNIX编程中需要特殊处理.只有定义的POSIX C函数列表被声明为可重入,并且可以在POSIX信号处理程序中调用.IEEE Std 1003.1列出了您在https://www.opengroup.org/找到的118个可重入的UNIX函数(需要登录).

但Python信号是异步的:信号模块有一个澄清:

虽然就Python用户而言,Python信号处理程序是异步调用的,但它们只能出现在Python解释器的"原子"指令之间.这意味着在纯C中实现的长计算期间到达的信号(例如大文本上的正则表达式匹配)可能会延迟一段任意时间.

在这种情况下,Python中的信号被推迟,直到GIL 空闲.

回到你的问题.,只要您在信号处理功能中使用重入功能.如果仅在线程中使用日志记录,则不会出现问题.