Пояснения демона

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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