2015-03-04 3 views
0

Я использую SocketServer.ThreadingMixIn, в основном как в docs.Остановка SocketServer с блокирующей ручкой

Кроме добыв клиентов работать на их собственный сценарий, я также переопределить метод handle, как я хочу, чтобы связь с клиентом, чтобы поддерживать и получать больше сообщений:

def handle(self): 
    try: 
     while True: 
      data = self.request.recv(1024) 
      if not data: 
       break # Quits the thread if the client was disconnected 
      else: 
       print(cur_thread.name) 
      self.request.send(data) 
    except: 
     pass 

Проблема заключается в том, что даже когда я пытаюсь завершить работу сервера с server.shutdown() или на KeyboardInterrupt, он все равно будет заблокирован на дескрипторе, если клиент поддерживает открытый сокет.

Как я могу эффективно остановить сервер, даже если есть еще подключенные клиенты?

+0

Отправьте код, вызывающий функцию ручки, пожалуйста. –

+0

См. Https://docs.python.org/2/library/socketserver.html#asynchronous-mixins; Я только извлек клиентов в отдельный скрипт и изменил дескриптор; все остальное такое же, как в документах. –

+0

У вас есть server_thread.daemon = True в коде? Если нет, он не выйдет при прерывании до тех пор, пока поток не будет завершен. –

ответ

0

Лучшим решением, которое я нашел, было использовать SocketServer.ForkingMixIn вместо SocketServer.ThreadingMixIn.

Таким образом, демон фактически работает, хотя использование процессов вместо потоков не совсем то, что я хотел.

Смежные вопросы