Отключить сервер сокетов, обслуживать_навсегда()в одном-поточном приложении Python

Я знаю, что 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.

18
задан Elias Zamaria 16 March 2016 в 21:28
поделиться