В документации Python сказано:
Поток может быть помечен как «поток демона». Значение этого флага заключается в том, что вся программа Python завершается, когда остаются только потоки демона. Начальное значение наследуется от потока создания.
У кого-нибудь есть более четкое объяснение того, что это значит, или практический пример, показывающий, где вы будете устанавливать темы daemonic
?
Поясните это для меня: так что единственная ситуация, в которой вы не установили бы потоки daemonic
, это когда вы хотите, чтобы они продолжали работать после выхода из основного потока?
источник
None
этом случае возвращается , но это не имеет значения, возвращаемое значение не используется.Допустим, вы делаете какой-то виджет приборной панели. Как часть этого, вы хотите, чтобы он отображал количество непрочитанных сообщений в вашем почтовом ящике. Итак, вы делаете небольшую ветку, которая будет:
Когда ваш виджет запускается, он создает этот поток, назначает его демоном и запускает его. Поскольку это демон, вам не нужно думать об этом; когда ваш виджет выйдет, поток автоматически остановится.
источник
Другие авторы приводили примеры для ситуаций, в которых вы будете использовать потоки демонов. Моя рекомендация, однако, никогда не использовать их.
Это не потому, что они бесполезны, а потому что есть некоторые плохие побочные эффекты, которые вы можете испытать, если будете их использовать. Потоки демона могут по-прежнему выполняться после того, как среда выполнения Python начинает разрушать объекты в основном потоке, вызывая некоторые довольно странные исключения.
Больше информации здесь:
https://joeshaw.org/python-daemon-threads-considered-harmful/
https://mail.python.org/pipermail/python-list/2005-February/343697.html
Строго говоря, они вам никогда не нужны, в некоторых случаях это просто упрощает реализацию.
источник
logging
и я ожидал, что после завершения потока все объекты (файловые дескрипторы для каждого потока / функции) будут уничтожены. В конце моей программы я увидел много выводов вродеIOError: [Errno 24] Too many open files:
. С помощьюlsof -p pid_of_program
я обнаружил, что FD были открыты, даже несмотря на то, что Thread / Функции закончили свою работу. Обходной путь? Удаление обработчика журнала в конце функции. Так чтоdaemonic
темы, не заслуживают доверия ...Возможно, проще думать об этом: при возвращении main ваш процесс не завершится, если все еще запущены потоки, не являющиеся демонами.
Небольшой совет: чистое отключение легко ошибиться, если задействованы потоки и синхронизация - если вы можете избежать этого, сделайте это. По возможности используйте потоки демонов.
источник
Крис уже объяснил, что такое потоки демонов, поэтому давайте поговорим о практическом использовании. Многие реализации пула потоков используют потоки демона для рабочих задач. Рабочие - это потоки, которые выполняют задачи из очереди задач.
Работнику нужно бесконечно ждать выполнения задач в очереди, так как они не знают, когда появится новая задача. Поток, который назначает задачи (скажем, основной поток), знает только, когда задачи завершены. Основной поток ожидает очереди задач, чтобы освободиться, а затем завершается. Если рабочие являются пользовательскими потоками, то есть не демонами, программа не будет завершена. Эти бесконечно работающие рабочие будут продолжать ждать, даже если рабочие не делают ничего полезного. Пометить рабочие потоки демонов, и основной поток позаботится об их уничтожении, как только завершит обработку задач.
источник
Цитирую Криса: «... когда ваша программа закрывается, все потоки демона автоматически уничтожаются». Я думаю, что это подводит итог. Вы должны быть осторожны, когда используете их, поскольку они внезапно завершаются, когда основная программа выполняется до конца.
источник
Когда ваш второй поток не является Daemon, основной основной поток вашего приложения не может выйти, поскольку его критерии выхода привязаны к выходу также из потоков, не являющихся Daemon. Потоки не могут быть принудительно уничтожены в python, поэтому вашему приложению придется действительно ждать выхода потоков, не являющихся Daemon. Если это поведение не то, что вам нужно, установите второй поток в качестве демона, чтобы он не сдерживал выход вашего приложения.
источник