Ваши модульные тесты должны использовать некоторый коэффициент нечеткости , либо принимая аппроксимации, либо используя какие-то вероятностные проверки.
Например, если у вас есть какая-то функция, которая возвращает результат с плавающей запятой, практически невозможно написать тест, который работает корректно на всех платформах. Ваши проверки должны были бы выполнить приближение.
TEST_ALMOST_EQ(result, 4.0);
Выше TEST_ALMOST_EQ
может убедиться, что result
находится между 3,9 и 4,1 (например).
В качестве альтернативы, если ваши алгоритмы машинного обучения являются вероятностными, ваши тесты должны будут учесть это, взяв среднее значение за несколько прогонов и ожидая, что оно будет в некотором диапазоне.
x = 0;
for (100 times) {
x += result_probabilistic_test();
}
avg = x/100;
TEST_RANGE(avg, 10.0, 15.0);
Конечно, тесты являются недетерминированными, поэтому вам нужно будет настроить их так, чтобы вы могли получить непроблематичные тесты с высокой вероятностью. (Например, увеличить количество испытаний или увеличить диапазон ошибок).
Вы также можете использовать макеты для этого (например, фиктивный генератор случайных чисел для ваших вероятностных алгоритмов), и они обычно помогают для детерминистского тестирования определенных путей кода, но они требуют больших усилий для поддержки. В идеале вы должны использовать комбинацию нечеткого тестирования и макетов.
НТН.
Какой unix
вы используете? На уровне C
существуют различные реализации и семантика для обработки сигналов в BSD по сравнению с Системой 5 (SYSV).
Я предполагаю, что вы используете SYSV, и в этом случае расположение сигнала сбрасывается на SIG_DFL после возврата обработчика сигнала (классическая обработка сигналов). В SYSV вам нужно вызвать signal
в обработчике, чтобы переустановить этот обработчик.
Python более или менее обеспечивает обработку сигналов в стиле BSD. Итак, в ОС SYSV Python должен управлять переустановкой обработчика сигналов через signal
. Теперь, согласно документации Python для siginterrupt
:
Обратите внимание, что установка обработчика сигнала с помощью signal () сбросит перезапуск поведение, которое можно прервать неявно вызывая siginterrupt () с истинное значение флага для данного сигнал.
И вот так - если Python автоматически переустанавливает ваш обработчик сигналов (для обеспечения семантики, подобной BSD), он вполне может делать это таким образом, что неявно вызывает siginterrupt (1 )
.
Конечно, мое предположение могло быть неверным.
Вы могли исправить это, определив sigquitHandler следующим образом:
def sigquitHandler(signum, frame):
print("SIGQUIT Handler")
siginterrupt(SIGQUIT, False)
Это зависит от того, когда и как Python восстановление расположения сигнала.
РЕДАКТИРОВАТЬ
Добавление siginterrupt (SIGQUIT, False)
в обработчик сигнала не оказывает никакого влияния.
РЕДАКТИРОВАТЬ 2
После некоторых дополнительных поисков в Python2. 6 ясно, что это не просто проблема SYSV. Это также повлияет на системы BSD.