Не получается закрыть основной поток от сокета с тредами
Вырубаю все дочерные потоки при помощи signal, однако не получается закрыть основной поток в сокет сервере.
Код:
import socket
import threading
import signal
HEADER_SIZE = 10
sock_serv = socket.socket()
sock_serv.bind(('localhost', 444))
sock_serv.listen(5)
exit_event = threading.Event()
def client_handler(conn):
full_message = b''
while True:
data = conn.recv(10)
full_message += data
if exit_event.is_set():
break
# когда приехал полный заголовок
if len(full_message) >= 10:
# декодирум длину из заголовка и получаем полный размер пакета
msg_len = HEADER_SIZE + int(full_message[:HEADER_SIZE])
# набежал ли полный пакет?
if len(full_message) >= msg_len:
# выдираем из него данные
payload = full_message[HEADER_SIZE:msg_len]
if payload.decode('utf-8') == '!exit':
conn.close()
break
print(payload.decode('utf-8'))
# удаляем пакет из буфера и суем в него всё что после
full_message = full_message[msg_len:]
def signal_handler():
exit_event.set()
signal.signal(signal.SIGINT, signal_handler)
while True:
connection, address = sock_serv.accept()
if exit_event.is_set():
break
if connection:
print(f'Got connection from {address}')
threading.Thread(target=client_handler, args=(connection,), daemon=True).start()