Поведение потоков Python при нажатии Ctrl+C во время соединенияPython

Программы на Python
Anonymous
Поведение потоков Python при нажатии Ctrl+C во время соединения

Сообщение Anonymous »

Я изо всех сил пытаюсь понять, что происходит с другими потоками, когда сочетание клавиш Ctrl+C прерывает основной поток, пока он ожидает завершения другого потока.
Вот небольшой фрагмент кода, проиллюстрируйте пример.

Код: Выделить всё

import time, threading

def worker():
time.sleep(5)
print("Thread finished")

t = threading.Thread(target=worker)
t.start()
try:
t.join()
except KeyboardInterrupt:
print("Interrupted")
С помощью этого кода, если я нажму ctrl+c до того, как появятся 5 секунд, я ожидаю, что в основном потоке будет вызвано KeyboardInterrupt внутри соединения, тогда оно будет перехвачено блок кроме печатает «Прервано».
Тогда основной поток достигнет конца своего кода и завершит работу, но Python еще не должен завершать работу, пока поток не завершится. , поскольку это не поток демона. Затем поток должен вывести сообщение «Поток завершен», и только тогда процесс Python должен завершиться.
Это соответствует моим наблюдениям при использовании Python 3.6 и 3.7, однако, когда я пробую это с Python 3.11 и 3.12 он печатает «Прервано» и процесс немедленно завершается.
Что мне кажется еще более странным, так это то, что если я заменю t.join() на время .sleep(100000), то перед выходом он ждет завершения потока... Кажется, что поток внезапно прерывается, если во время соединения происходит нажатие Ctrl+C, но не иначе ...
Я не смог найти этому объяснения в документации. Единственная релевантная информация, которую я нашел, была такая: мне кажется, что 3.11 и 3.12 ведут себя неправильно.

Вся программа Python завершает работу, когда нет живых потоков, не являющихся демонами. остались.

Это на самом деле просто ошибка или есть реальное объяснение, почему я не знаю, почему оно так себя ведет? Если да, то есть ли способ задокументировать поведение в версии 3.12?

Подробнее здесь: https://stackoverflow.com/questions/785 ... uring-join

Вернуться в «Python»