siginterrupt () только работает на первый сигнал? (Python)

Ваши модульные тесты должны использовать некоторый коэффициент нечеткости , либо принимая аппроксимации, либо используя какие-то вероятностные проверки.

Например, если у вас есть какая-то функция, которая возвращает результат с плавающей запятой, практически невозможно написать тест, который работает корректно на всех платформах. Ваши проверки должны были бы выполнить приближение.

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);

Конечно, тесты являются недетерминированными, поэтому вам нужно будет настроить их так, чтобы вы могли получить непроблематичные тесты с высокой вероятностью. (Например, увеличить количество испытаний или увеличить диапазон ошибок).

Вы также можете использовать макеты для этого (например, фиктивный генератор случайных чисел для ваших вероятностных алгоритмов), и они обычно помогают для детерминистского тестирования определенных путей кода, но они требуют больших усилий для поддержки. В идеале вы должны использовать комбинацию нечеткого тестирования и макетов.

НТН.

7
задан Ian P 3 November 2009 в 02:45
поделиться

1 ответ

Какой 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.

2
ответ дан 7 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: