我试图通过使用SVC
以及引发异常的适当信号处理程序来停止sklearn signal.alarm
的拟合过程。
以下是MWE
import numpy as np
from sklearn.svm import SVC
import signal
n = int(1e5)
np.random.seed(1)
X = np.random.random((n, 100))
y = np.random.choice(['A', 'B'], size=n)
def timeout_handler(s, f):
raise Exception('Timed out')
def not_interrupting():
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(3)
# this should take on the order of minutes
SVC().fit(X, y)
signal.alarm(0)
def interrupting():
signal.alarm(3)
SVC().fit(X, y)
signal.alarm(0)
# interrupts (but kills the current python process)
interrupting()
# doesn't interrupt as expected within 3 seconds
not_interrupting()
这似乎不起作用。引发的异常不会中断执行。但是,如果我没有像interrupting
中那样注册信号处理程序,它会中断但会杀死当前的python进程。有什么建议吗?
其他信息:
我想我可能找到了自己的答案。根据{{1}}文档:
尽管就Python用户而言,Python信号处理程序是异步调用的,但它们只能出现在Python解释器的“原子”指令之间。这意味着在长时间计算过程中到达的信号纯粹用C实现(例如大型文本上的正则表达式匹配)可能会延迟一段时间。
我相信signal
使用SVC
,因此导致我的信号处理程序被调用延迟。