Вот небольшой фрагмент кода, проиллюстрируйте пример.
Код: Выделить всё
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")
Тогда основной поток достигнет конца своего кода и завершит работу, но 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