class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): def handle(self): logger.info({'module': 'server', 'msg': 'Client connected %s' % self.client_address[0]}) cur_thread = threading.current_thread() data = self.request.recv(1024) # clip input at 1Kb try: msg_analyser(data) response = "{}: {}".format(cur_thread.name, data) except: response = "Bad request" logger.exception({'module': 'server', 'msg': 'Problem handling request %s' % self.client_address[0]}) self.request.sendall(response) class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): logger.info({'module': 'server', 'msg': 'Listening'}) # Ctrl-C will cleanly kill all spawned threads daemon_threads = True # much faster rebinding allow_reuse_address = True def __init__(self, server_address, RequestHandlerClass): SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass) if __name__ == "__main__": server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler) server_thread = threading.Thread(target=server.serve_forever) ip, port = server.server_address logger.info({'module': 'server', 'msg': 'Listening On %s:%s' % (ip, port)}) # terminate with Ctrl-C try: server_thread.start() except KeyboardInterrupt: sys.exit(0) printer_init()