2011-01-05 67 views
5

讨论Signal handlers and logging in Python在我的脑海里想到了哪些函数可重入Python的问题。Python中有哪些函数可重入信号库处理

signal library提到:

虽然Python的信号处理程序 异步调用尽可能的 Python的用户而言,他们可以只 了Python解释器 的原子 指令之间发生。这意味着在长时间计算期间到达的信号 纯粹以C实现(例如 正文表达匹配大 文本正文)可能会延迟任意时间量 。

这再入口不典型的被指出logging library

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

我有点困惑,因为信号库谈论GIL(全局解释器锁)作为“..原子指令之间......”。在这种情况下,一旦GIL离开/ 解锁,信号被推迟并执行。一种信号队列。

这很有道理,但是延迟信号处理程序调用的函数是否可重入是没关系的,因为它们不是在具有“重入”限制的POSIX信号处理程序中调用的:

只有POSIXç 功能的定义的列表被声明为重入 ,并且可以在POSIX 信号处理程序中被调用。 IEEE Std 1003.1列出了 118个重入UNIX函数,您会发现 处于https://www.opengroup.org/(需要登录 )。

回答

2

我认为是什么使日志模块非重入的是,它采用了threading.Lock(而不是RLock)以多个线程登录到相同的处理器(所以消息没有得到交织的)同步。

这意味着,如果已经获得锁的通话记录,通过信号处理程序中断和信号处理程序试图登录它会永远死锁等待上acquire被释放。

这些锁与GIL无关,它们是“用户创建”的锁,可以用它来解释,GIL是解释器使用的锁(实现细节)。

+0

我检查了Python 2.7.1版本并且你的假设是错误的。检查http://svn.python.org/view/python/tags/r271/Lib/logging/__init__.py?revision=86833&view=markup – 2011-01-05 14:07:39

+0

中的'_acquireLock()'函数我纠正了,它实际上是' RLock'。感谢您挖掘它。但是,根据文档,实现可能并不总是可重入的:“这是因为线程模块中的锁实现并不总是可重入的”(http://docs.python.org/library/logging.html #thread-safety) – albertov 2011-01-05 14:25:23

+0

这就是我在我的问题中提到的。我们可以总结一下,使用线程库的每个模块在用于* real * POSIX信号处理程序的意义上都是不可重入的。但是Python不推迟信号处理? – 2011-01-05 14:56:45