@MuffinLover

Почему он выдает interrupt exception, который не ловится?

class NetworkTopology:
    def __init__(self, receive_sock: ReceiveSocket, send_sock: SendSocket):
        self.receive_thread: threading.Thread = threading.Thread(target=self.receive_data)
        self.receive_sock: ReceiveSocket = receive_sock
        self.send_sock: SendSocket = send_sock

    def receive_data(self):
        while True:
            data = self.receive_sock.recv(1024)
            print(f"Received message: {GameAnnouncement().parse(data)}")

    def start_listen(self):
        self.receive_thread.start()

    def get_send_sock(self) -> SendSocket:
        return self.send_sock


if __name__ == "__main__":
    try:
        conf = ("239.255.255.254", 5000)
        t = NetworkTopology(MulticastReceiveSocket(*conf), UDPSendSocket(conf))
        t.start_listen()
    except KeyboardInterrupt:
        print("Interrupting...")


Почему-то не могу поймать это исключение. Методом тыка понял что если сделать джойн, то поймается, но хочется без джойна
  • Вопрос задан
  • 63 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Потому что вызов thread.start() который внутри start_listen() - не блокирующий. Главный поток продолжит работу, выйдет из try-except и завершится, так что на момент возникновения KeyboardInterrupt он уже будет завершён. Твой поток не помечен как daemon, поэтому интерпретатор продолжит работу (был бы помечен - программа бы завершилась тут же).
Если ты делаешь join() - то пока запущенный поток не закончится, главный не продолжит работу.

Собственно, в текущем виде тебе поток вообще не нужен, у тебя главный поток ничего не делает и так, и так.
Что ты пытаешься сделать?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы