Python 2 не обрабатывает сигналы, если TCPServer работает в другом потоке

Играя со стандартной библиотекой, я обнаружил странную разницу между python2 и python3. Если я попытаюсь поймать сигнал в python2, пока TCPServer работает в другом потоке, сигнал не будет обработан, но в python3 это произойдет.

Вот сценарий, который воспроизводит проблему

import signal
import threading
import sys 
if sys.version_info > (3,0):
    from socketserver import TCPServer, BaseRequestHandler
else:
    from SocketServer import TCPServer, BaseRequestHandler

def shutdown(signum, frame):
    print("Shutting down server thread")
    server.shutdown()

server = TCPServer(
    ('127.0.0.1', 7654),
    BaseRequestHandler
)
signal.signal(signal.SIGTERM, shutdown)
signal.signal(signal.SIGINT, shutdown)
server_thread = threading.Thread(target=server.serve_forever)
print("Starting server thread")
server_thread.start()
print("Waiting for server thread to shut down")
server_thread.join()
print("Server thread terminated")

Это вывод из python3:

Starting server thread
Waiting for server thread to shut down
^CShutting down server thread
Server thread terminated

А это из python2:

Starting server thread
Waiting for server thread to shut down
^CKilled

«^C» — это прерывание клавиатуры, а «Killed» — сигнал, который я отправил к процессу.

Почему не было вызвано отключение?

5
задан ThiefMaster 6 June 2012 в 21:00
поделиться