Я знаю, что у socketserver есть метод shutdown(), который заставляет сервер закрываться, но это работает только в приложении с несколькими потоками, так как выключение должно вызываться из другого потока, чем поток, в котором работает serve_forever().
Мое приложение обрабатывает только один запрос во времени, поэтому я не использую отдельные потоки для обработки запросов, и я не могу вызвать shutdown(), потому что он вызывает тупик (это не в документах, но оно указано непосредственно в исходном коде SocketServer).
Вставьте здесь упрощенную версию моего кода для лучшего понимания:
import socketserver
class TCPServerV4(socketserver.TCPServer):
address_family = socket.AF_INET
allow_reuse_address = True
class TCPHandler(socketserver.BaseRequestHandler):
def handle(self):
try:
data = self.request.recv(4096)
except KeyboardInterrupt:
server.shutdown()
server = TCPServerV4((host, port), TCPHandler)
server.server_forever()
Мне известно, что этот код не работает. Я просто хотел показать вам то, что я хотел бы выполнить, - завершить работу сервера и выйти из приложения во время ожидания входящих данных, когда пользователь нажимает Ctrl-C.