Значение свойства демона в потоках Python

Я немного запутался в том, что означает установка потока как демона.

В документации сказано следующее:

Поток можно пометить как «поток демона». Значение этого флага заключается в том, что вся программа Python завершается, когда остаются только потоки демона. Начальное значение наследуется от создающего потока. Флаг можно установить через свойство daemon.

Я не уверен, что отличает это от обычного потока.

Это говорит о том, что эта программа никогда не закончится?

def threadfunc():
    while True:
        time.sleep(1)

threading.Thread(target=threadfunc).start()

Даже если основной поток завершает выполнение. Пока кончим сразу?

def threadfunc():
    while True:
        time.sleep(1)

th = threading.Thread(target=threadfunc)
th.daemon = True
th.start()

Я спрашиваю, потому что у меня есть ситуация, когда в моем основном потоке я вызываю sys.exit (), и процесс просто зависает, а другие мои потоки выполняются, поскольку я могу видеть журнал.

Связано ли это с вызовом sys.exit () с живыми потоками?


person Falmarri    schedule 01.12.2010    source источник
comment
Возможный дубликат объяснения потоков демона   -  person Mr_and_Mrs_D    schedule 17.09.2018
comment
Могу ли я интерпретировать daemon = True как этот поток как демон основного потока?   -  person jtcloud    schedule 05.02.2020


Ответы (4)


Это говорит о том, что эта программа никогда не закончится?

Да, эта программа не завершится, просто попробуйте.

Я спрашиваю, потому что у меня есть ситуация, когда в моем основном потоке я вызываю sys.exit (), и процесс просто зависает, а другие мои потоки выполняются, поскольку я могу видеть журнал. Связано ли это с вызовом sys.exit () с живыми потоками?

Да, даже exit не останавливает другие потоки, он просто вызывает SystemExit в основном потоке. Таким образом, хотя основной поток остановится (как и в случае любого другого необработанного исключения), все другие недемонические потоки будут продолжать работать.

person Jochen Ritzel    schedule 01.12.2010
comment
Хорошо, это нормально, но есть ли способ заставить мою программу выйти с запущенными потоками и по-прежнему вызывать хуки atexit ()? - person Falmarri; 02.12.2010
comment
@Falmarri: При чем тут atexit? Либо превратите свои потоки в демонов, либо напишите код, который их отключает, тогда ваша программа может выйти (и вызвать функции выхода, которые я предполагаю). - person Jochen Ritzel; 02.12.2010
comment
Я пытаюсь что-то взломать, чтобы отладить какой-то код. Я не могу менять темы и прочее. Думаю, придется искать другое решение. - person Falmarri; 02.12.2010
comment
Документация (docs.python.org/3/library/threading.html # thread-objects) говорит о том, что потоки демона внезапно останавливаются при завершении работы. - Разве это не значит, что - когда основная программа завершает работу, потоки демона завершаются? - person variable; 28.06.2021

Установка thread.daemon = True позволит выйти из основной программы. Перед завершением приложения обычно ждут завершения всех дочерних потоков.

person TelegramSam    schedule 01.12.2010
comment
Но, если вы не используете join (), эти потоки могут запускать aline, как процесс зомби ... так что эту опцию демона следует использовать с join (). Не надо? - person m3nda; 23.10.2015
comment
Это не совсем правда @ erm3nda. В потоке нет лишнего процесса. Помните, что без других мер все программы Python являются отдельными процессами. .join() будет блокировать вызывающую область до тех пор, пока поток не закончится, что, конечно, может быть проблемой, если оно никогда не закончится. Настройка потока как демонического просто указывает родительскому потоку убить его, когда это необходимо, а не неявно .join()ing, когда родитель хочет выйти. Я буквально только что узнал об этом несколько секунд назад, и по какой-то причине мне это показалось очень нелогичным. - person John Carrell; 13.09.2018
comment
Спасибо @JohnCarrell - person m3nda; 14.09.2018
comment
Документация (docs.python.org/3/library/threading.html # thread-objects) говорит о том, что потоки демона внезапно останавливаются при завершении работы. - Разве это не значит, что - когда основная программа завершает работу, потоки демона завершаются? - person variable; 28.06.2021

  1. Потоки с демоном не будут завершены, когда завершится основной поток.
  2. Потоки без демона завершатся, когда завершится основной поток.
person Zachary    schedule 06.07.2021

person    schedule
comment
Ваш основной поток завершится, а ваш демон по-прежнему будет работать в фоновом режиме - разве это не тот случай, когда поток не является демоном? - person Jeppe; 11.08.2020
comment
Вы говорите, что если какой-либо поток выполняет функцию while true:, то это поток переднего плана, а не демон? - person y_159; 10.04.2021