GIL (Global Interpreter Lock) предотвращает одновременный запуск любого кода Python, поэтому технически основной поток не может обработать сигнал во время работы других потоков. Это может «выглядеть» таким образом, но есть один большой мьютекс, который позволяет запускать одновременно только один поток Python.
Насколько я могу догадаться, проблема с сигналами и потоками заключается в том, что сигнал обычно вызывается прерыванием, которое может произойти в любое время. Так что я представляю, что Python останавливает свою работу и вызывает обработчик. К этому моменту блокировка, возможно, уже была получена, и поэтому, если регистрация попытается заблокировать снова, вы получите тупик. В некоторых реализациях это работает нормально, потому что мьютекс может быть заблокирован несколько раз (повторный вход), но в других есть только одна блокировка.
Надеюсь, кто-то еще сможет это подтвердить.