32 lines
895 B
Python
32 lines
895 B
Python
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()
|