SIGALRM不会中断长时间运行的SVC拟合

时间:2017-11-02 01:31:02

标签: python scikit-learn

我试图通过使用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进程。有什么建议吗?

其他信息:

  • scikit-learn 0.18.1
  • Python 3.6.1
  • OS X 10.11.16

我想我可能找到了自己的答案。根据{{​​1}}文档:

  

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

我相信signal使用SVC,因此导致我的信号处理程序被调用延迟。

0 个答案:

没有答案