Объяснение Потоков Демона
на документация Python
он говорит:
поток может быть помечен как "поток демона". Значение этого
флаг заключается в том, что вся программа Python завершает работу, когда только потоки демона
остаться. Начальное значение наследуется от создающего потока.
у кого-нибудь есть более четкое объяснение того, что это означает, или практический пример, показывающий, где вы хотели бы установить темы как daemonic?
To уточните для меня:
Так что единственный раз, когда вы не установить потоки как демонические, если вы хотите, чтобы они продолжали работать после выхода из основного потока?
7 ответов:
некоторые потоки выполняют фоновые задачи, такие как отправка пакетов keepalive, или выполнение периодической сборки мусора, или что-то еще. Они полезны только тогда, когда основная программа запущена, и это нормально, чтобы убить их, как только другие, не-демон, потоки вышли.
без потоков демона, вы должны были бы отслеживать их, и сказать им, чтобы выйти, прежде чем ваша программа может полностью выйти. Установив их в качестве потоков демона, вы можете позволить им работать и забыть о них, а когда ваша программа завершает работу, все потоки демона автоматически убиваются.
допустим, вы делаете какой-то виджет приборной панели. Как часть этого, вы хотите, чтобы он отображал количество непрочитанных сообщений в вашем почтовом ящике. Итак, вы делаете небольшую нить, которая будет:
- подключиться к почтовому серверу и спросить, сколько непрочитанных сообщений у вас есть.
- сигнал GUI с обновленным количеством.
- немного поспать.
когда ваш виджет запускается, он создаст этот поток, назначит его демоном и начнет оно. Поскольку это демон, вам не нужно думать об этом; когда ваш виджет выйдет, поток автоматически остановится.
более простой способ подумать об этом, возможно: когда main возвращается, ваш процесс не выйдет, если все еще работают потоки, отличные от daemon.
немного советов: чистое выключение легко ошибиться, когда задействованы потоки и синхронизация - если вы можете этого избежать, сделайте это. Используйте потоки демона, когда это возможно.
Крис уже объяснил, что такое потоки демонов, поэтому давайте поговорим о практическом использовании. Многие реализации пула потоков используют потоки демонов для рабочих задач. Рабочие потоки, которые выполняют задачи из очереди задач.
работник должен продолжать ждать задач в очереди задач на неопределенный срок, поскольку они не знают, когда появится новая задача. Поток, который назначает задачи (скажем, основной поток), знает только, когда задачи закончены. Основной поток ожидает очереди задач, чтобы получить пустой, а затем завершает работу. Если рабочие-это пользовательские потоки, т. е. не демон, программа не завершится. Он будет продолжать ждать этих бесконечно работающих рабочих, даже если рабочие не делают ничего полезного. Отметьте рабочие потоки демона, и основной поток позаботится об их убийстве, как только он закончит обработку задач.
другие плакаты дали несколько примеров для ситуаций, в которых вы будете использовать потоки демонов. Моя рекомендация, однако, никогда не использовать их.
Это не потому, что они не полезны, а потому, что есть некоторые плохие побочные эффекты, которые вы можете испытать, если вы их используете. Потоки демонов все еще могут выполняться после того, как среда выполнения Python начинает разрушать вещи в основном потоке, вызывая некоторые довольно странные исключения.
Подробнее здесь:
https://joeshaw.org/python-daemon-threads-considered-harmful/
https://mail.python.org/pipermail/python-list/2005-February/343699.html
строго говоря, вы не нуждаетесь в них, это просто облегчает внедрение в некоторых случаях.
Цитирую Крис: "... когда ваша программа завершает работу, все потоки демона автоматически убиваются.". Я думаю, что это подводит итог. Вы должны быть осторожны при их использовании, поскольку они резко прекращаются, когда основная программа выполняется до завершения.
когда ваш второй поток не является демоном, основной поток вашего приложения не может выйти, потому что его критерии выхода привязаны к выходу также из потока(ов) не-Демона. Потоки не могут быть принудительно убиты в python, поэтому ваше приложение должно будет действительно ждать выхода потока(ов), не являющегося демоном. Если это поведение не то, что вы хотите, а затем установить второй поток в качестве демона, так что он не будет сдерживать ваше приложение от выхода.
Comments