Триггер, вложенный в `KeyboardInterrupt` - PullRequest
1 голос
/ 16 мая 2019

В таких областях, как поиск или оптимизация, некоторые функции (например, sklearn.neural_network.MLPRegressor.fit) разработаны таким образом, что при отправке KeyboardInterrupt он немедленно возвращает текущий лучший результат (а не вызывает исключение).Это удобно в том смысле, что нужен результат.

Но если у меня есть подпрограмма мета-оптимизации, которая использует эту функцию в качестве подпрограммы, моя основная подпрограмма не сможет получить KeyboardInterruptи он продолжит работу, что делает программу «неостановимой».

Примером может быть:

from sklearn.neural_network import MLPRegressor
def optimize_many_times_and_take_best(x, y, model=MLPRegressor()):
    best = -1
    try:
        for i in range(20):
            best = max(best, model.fit(x, y).score(x, y))
    except KeyboardInterrupt:
        pass
    return best

Когда я нажму Ctrl-C, model.fit немедленно вернется, аoptimize_many_times_and_take_best продолжит цикл for, потому что он не получил KeyboardInterrupt.Он будет вызывать model.fit снова через очень короткое время, и мне нужно очень быстро нажать Ctrl-C, прежде чем я смогу остановить программу.

Мне интересно, для такого типа вложенных KeyboardInterruptЛовушка, есть ли хорошее решение для прерывания всех процедур оптимизации?

В этом случае, поскольку MLPRegressor выдает UserWarning на KeyboardInterrupt, я могу вместо этого поймать предупреждение, но есть ли лучшее решение?Должен ли я написать какой-либо механизм сообщений (например, warnings или несколько bool) явно для всех циклов?

...