Пояснения к темам демонов - PullRequest
208 голосов
/ 10 октября 2008

В документации Python это говорит:

Поток может быть помечен как "поток демона". Значение этого признак того, что вся программа Python завершается, когда только потоки демона осталось. Начальное значение наследуется от потока создания.

Есть ли у кого-нибудь более четкое объяснение того, что это значит, или практический пример, показывающий, где вы бы хотели установить темы как daemonic?


Чтобы уточнить для меня:

так что единственный раз, когда вы не установите потоки в качестве демонических, это если вы хотите, чтобы они продолжали работать после выхода из основного потока?

Ответы [ 7 ]

397 голосов
/ 10 октября 2008

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

Без потоков демонов вам придется отслеживать их и просить их выйти, прежде чем ваша программа сможет полностью завершиться. Установив их как потоки демонов, вы можете позволить им запускаться и забывать о них, а когда ваша программа завершает работу, все потоки демонов автоматически уничтожаются.

25 голосов
/ 10 октября 2008

Допустим, вы создаете какой-то виджет приборной панели. Как часть этого, вы хотите, чтобы он отображал количество непрочитанных сообщений в вашем почтовом ящике. Итак, вы создаете небольшую ветку, которая будет:

  1. Подключитесь к почтовому серверу и спросите, сколько у вас непрочитанных сообщений.
  2. Сигнализировать графический интерфейс с обновленным счетчиком.
  3. Спи немного.

Когда ваш виджет запускается, он создает этот поток, назначает его демоном и запускает его. Поскольку это демон, вам не нужно об этом думать; при выходе из виджета поток автоматически останавливается.

14 голосов
/ 10 октября 2008

Более простой способ думать об этом, возможно: при возвращении main ваш процесс не завершится, если все еще работают потоки, не являющиеся демонами.

Небольшой совет: чистое отключение легко ошибиться, когда задействованы потоки и синхронизация - если вы можете избежать этого, сделайте это. По возможности используйте потоки демонов.

13 голосов
/ 25 февраля 2009

Другие авторы приводили примеры для ситуаций, в которых вы будете использовать потоки демонов. Однако я никогда не рекомендую их использовать.

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

Больше информации здесь:

https://joeshaw.org/python-daemon-threads-considered-harmful/

https://mail.python.org/pipermail/python-list/2005-February/343699.html

Строго говоря, они вам никогда не нужны, в некоторых случаях это просто упрощает реализацию.

9 голосов
/ 27 августа 2016

Крис уже объяснил, что такое потоки демонов, так что давайте поговорим о практическом использовании. Многие реализации пула потоков используют потоки демона для рабочих задач. Рабочие - это потоки, которые выполняют задачи из очереди задач.

Работнику нужно бесконечно ждать выполнения задач в очереди, так как они не знают, когда появится новая задача. Поток, который назначает задачи (скажем, основной поток), знает только, когда задачи завершены. Основной поток ожидает очереди задач, чтобы освободиться, а затем завершается. Если рабочие являются пользовательскими потоками, то есть не демонами, программа не будет завершена. Эти бесконечно работающие рабочие будут продолжать ждать, даже если рабочие не делают ничего полезного. Отметьте рабочие потоки демонов, и основной поток позаботится об их уничтожении, как только завершит обработку задач.

6 голосов
/ 12 августа 2011

Цитата Криса: «... когда ваша программа завершает работу, любые потоки демона автоматически уничтожаются». Я думаю, что это подводит итог. Вы должны быть осторожны, когда используете их, поскольку они внезапно завершаются, когда основная программа выполняется до конца.

0 голосов
/ 14 июля 2018

Когда ваш второй поток не является Daemon, основной основной поток вашего приложения не может выйти, так как его критерии выхода привязаны к выходу также из потоков, не являющихся Daemon. Потоки не могут быть принудительно уничтожены в python, поэтому вашему приложению придется действительно ждать выхода потоков, не являющихся Daemon. Если это поведение не то, что вам нужно, установите второй поток в качестве демона, чтобы он не сдерживал выход вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...