Это сделано для того, чтобы избежать (полу) прерывания, поскольку Twisted - это кооперативная многозадачная система. Ctrl-C обрабатывается в Python с помощью обработчика SIGINT, установленного интерпретатором при запуске. Обработчик устанавливает флаг, когда он вызывается. После выполнения каждого байтового кода интерпретатор проверяет флаг. Если он установлен, KeyboardInterrupt повышается в этой точке.
Реактор устанавливает собственный обработчик SIGINT. Это заменяет поведение обработчика интерпретатора. Обработчик реактора инициирует остановку реактора. Поскольку он не вызывает исключение, он не прерывает любой выполняемый код. Цикл (или что-то еще) заканчивается, и когда управление возвращается реактору, отключение продолжается.
Если вы предпочитаете, чтобы Ctrl-C (то есть SIGINT) вызывал KeyboardInterrupt, то вы можете просто восстановить обработчик SIGINT в Python, используя сигнальный модуль:
signal.signal(signal.SIGINT, signal.default_int_handler)
Обратите внимание, однако, что если вы отправляете SIGINT во время выполнения кода из Twisted, а не код своего собственного приложения, поведение не определено, поскольку Twisted не ожидает прерывания KeyboardInterrupt.