Я знаю, что socketserver имеет метод shutdown(), который вызывает выключение сервера, но это работает только в многопоточном приложении, так как выключение необходимо вызывать из разных поток, чем поток, в котором работает serve_forever().
Мое приложение обрабатывает только один запрос за раз, поэтому я не использую отдельные потоки для обработки запросов, и я не могу вызвать завершение работы(), так как это вызывает взаимоблокировку (этого нет в документах, но это указано непосредственно в исходный код 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.