ptb*_*ptb 5 c python signals python-c-api python-c-extension
我有一个 C 扩展,它实现了 LRU 缓存https://github.com/pbrady/fastcache。我最近注意到,在一个大量使用缓存的应用程序(SymPy)中,超时信号丢失,而应用程序继续运行。仅当使用我的 C 扩展而不是使用纯 Python LRU 缓存(即 functools.lru_cache)时才会发生这种情况https://github.com/pbrady/fastcache/issues/26。
我在例程中添加了对 PyErr_CheckSignals() 的调用,信号丢失的频率降低了,但这种情况仍然会发生。请注意,在调用期间,缓存将调用 PyObject_Hash、PyDict_Get/Set/DelItem 和 PyObject_Call(在未命中的情况下)。
这是 SymPy 代码的相关片段(超时是一个整数):
def _timeout(self, function, timeout):
def callback(x, y):
signal.alarm(0)
raise Skipped("Timeout")
signal.signal(signal.SIGALRM, callback)
signal.alarm(timeout) # Set an alarm with a given timeout
function()
signal.alarm(0) # Disable the alarm enter code here
Run Code Online (Sandbox Code Playgroud)
有什么东西会覆盖信号吗?如果是这样,我该如何解决这个问题?