Играя со стандартной библиотекой, я обнаружил странную разницу между 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» — сигнал, который я отправил к процессу.
Почему не было вызвано отключение?