При использовании сигналов и потоков вы, вероятно, не доберетесь далеко.Из документации по сигналу :
... только основной поток может установить новый обработчик сигнала, и основной поток будет единственным, чтобы получать сигналы (это принудительно выполняетсясигнальным модулем Python, даже если реализация базового потока поддерживает отправку сигналов отдельным потокам) ...
Что касается недостатков, интерпретатор будет вызывать обработчик сигнала только после того, как интерпретатор вернется квыполняется в контексте основного потока.Если у вас есть длительный вызов расширения C (SQL-запрос, системный ввод-вывод и т. Д.), То сигналы SIGINT и SIGTERM не будут обрабатываться до тех пор, пока они не вернутся.Если у вас есть строгие временные требования, которые вы соблюдаете, то это не поможет.Лучший способ найти способ обойти это - распределить задачи по дочернему процессу, использовать SIGKILL, чтобы завершить дочерний процесс по таймауту, а затем создать замещающий дочерний процесс (пользовательский пул процессов).
Кроме того, если вы хотите использовать обработчик сигнала как способ выпрыгнуть из блока кода с помощью асинхронно возбуждаемых исключений, то нет гарантии вменяемости состояния вашей программы.Само исключение может даже привести к тому, что его вызовут в непредусмотренных местах.
Для ваших нужд при программировании сокетов вы должны начать с использования неблокирующего ввода-вывода и цикла выбора для опросаготовность.Или вы можете использовать модуль asyncore или нестандартную библиотеку twisted , которая абстрагирует многие из этих деталей.