import threading from socketserver import TCPServer, ThreadingMixIn class ThreadingTCPListener(ThreadingMixIn, TCPServer): allow_reuse_address = True class Server: def __init__(self, addresses, handler): self.servers = [ThreadingTCPListener(address, handler) for address in addresses] self._shutdown = threading.Event() def serve_forever(self): threads = [threading.Thread(target=server.serve_forever) for server in self.servers] for thread in threads: thread.daemon = True thread.start() try: self._shutdown.wait() except KeyboardInterrupt: self.shutdown() finally: for thread in threads: thread.join() def shutdown(self): for server in self.servers: server.shutdown() self._shutdown.set()