2014-07-23 186 views
0

我在Python 3.4中擴展socketserver.ThreadingMixIn來構建我自己的線程服務器,同時保持原始回調僅爲記錄海豚而越冬。 激活和創建非常簡單,根據python文檔,我遇到的問題是使用server.shutdown()停止該服務器。它捲曲並不會退出。我需要關閉該服務器而不使用ctrl-c的方式,因爲它也會涉及到該服務器的一些GUI。在python中停止socketserver.ThreadingMixIn

基本服務器:

class ServerBasic(socketserver.ThreadingMixIn,socketserver.TCPServer): 

logging.basicConfig(level=logging.DEBUG,format='%(name)s: %(message)s',) 

def __init__(self, log_name,server_address, handler_class=ThreadedRequestHandler): 
    self.logger = logging.getLogger(log_name) 
    self.logger.debug('__init__') 
    socketserver.TCPServer.__init__(self, server_address, handler_class) 
    return 

def server_activate(self): 
    self.logger.debug('server_activate') 
    socketserver.TCPServer.server_activate(self) 
    return 

def serve_forever(self): 
    self.logger.debug('waiting for request') 
    self.logger.info('Handling requests, press <Ctrl-C> to quit') 
    while True: 
     self.handle_request() 
    return 

延伸類:

class ManagerServer(PIRServerBasic): 


def __init__(self, log_name, handler_class=T_ManagerRequestHandler): 
    self.tup_socket = (ipAddress, WELCOME_PORT) # tuple of the address and port 
    self.log_name = log_name 
    return ServerBasic.__init__(self, log_name, self.tup_socket, handler_class=handler_class) 

在這裏,這一切是如何創建並運行:

o_serverManager = ManagerServer('Manager_Server', T_ManagerRequestHandler) 
t_managerServer = threading.Thread(target=o_serverManager.serve_forever) 
t_managerServer.daemon = True 
t_managerServer.start() 

sleep(15) 
o_serverManager.shutdown() 

shutdown命令後,程序被卡住。

回答

2

在覆蓋serve_forever方法時,您已經刪除了在關閉請求中斷開while循環的條件。最初的方法是這樣的:

def serve_forever(self, poll_interval=0.5): 
    """Handle one request at a time until shutdown. 

    Polls for shutdown every poll_interval seconds. Ignores 
    self.timeout. If you need to do periodic tasks, do them in 
    another thread. 
    """ 
    self.__is_shut_down.clear() 
    try: 
     while not self.__shutdown_request: 
      r, w, e = _eintr_retry(select.select, [self], [], [], 
            poll_interval) 
      if self in r: 
       self._handle_request_noblock() 
    finally: 
     self.__shutdown_request = False 
     self.__is_shut_down.set() 

您需要在您的覆蓋來實現類似的系統,尋找一組__shutdown_request標誌,並採取適當的行動。這也要求你的處理程序是非阻塞的。

+0

你的答案解決了我的問題。我沒有看到該回調的原始實現,它確實阻止了我的主線程退出。謝謝 – Eli