#python #multithreading #new-operator
#python #многопоточность #новый оператор
Вопрос:
В чем разница между thread.start_new_thread
и threading.Thread.start
в python?
Я заметил, что при start_new_thread
вызове новый поток завершается, как только завершается вызывающий поток. threading.Thread.start
наоборот: вызывающий поток ожидает завершения других потоков.
Ответ №1:
thread
Модуль представляет собой низкоуровневый потоковый API Python. Его прямое использование не рекомендуется, если вам действительно не нужно. threading
Модуль представляет собой высокоуровневый API, построенный поверх thread
. Thread.start
Метод фактически реализован с использованием thread.start_new_thread
.
daemon
Атрибут Thread
должен быть установлен перед вызовом start
, указывая, должен ли поток быть демоном. Вся программа Python завершается, когда не осталось живых потоков, не относящихся к демону. По умолчанию daemon
равно False
, поэтому поток не является демоном, и, следовательно, процесс будет ожидать завершения всего своего недемонического потока, что и является поведением, которое вы наблюдаете.
PS start_new_thread
действительно очень низкоуровневый. Это просто тонкая оболочка вокруг основной программы запуска потоков Python, которая сама вызывает функцию создания потоков ОС.
Ответ №2:
Посмотрите на потоковую обработку.Флаг Thread.daemon — в принципе, всякий раз, когда не выполняются потоки, не относящиеся к демону, интерпретатор завершается.