В отличие от обычных процессов, Python, похоже, не обрабатывает сигналы по-настоящему асинхронно.Вызов join () каким-то образом блокирует основной поток таким образом, чтобы он не реагировал на сигнал.Я немного удивлен этим, так как я не вижу ничего в документации, указывающей, что это может / должно произойти.Решение, однако, простое.В вашем основном потоке добавьте следующий цикл перед вызовом 'join ()' для потоков:
while keep_testing:
signal.pause()