В таких областях, как поиск или оптимизация, некоторые функции (например, 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
) явно для всех циклов?