Параллельные потоки в Python — Daemon Thread
В сегодняшнем посте мы рассмотрим использование потоков в Python. Прежде чем мы начнем с основной темы, давайте сначала посмотрим, что такое Daemon Thread.
Что такое Daemon Thread?
Daemon Thread в Python — это тип потока, который может работать независимо в фоновом режиме. Эти виды потоков выполняются независимо от основного потока. Так что они называются неблокирующими потоками.
Когда вам могут понадобиться потоки Daemon в Python?
Предположим, вам нужно иметь длительную задачу, которая пытается читать файлы журнала. Эта задача должна предупреждать пользователя при обнаружении сообщения об ошибке в журналах.
Мы можем назначить поток Daemon для этой задачи, который может отслеживать наши файлы журналов, в то время как наша основная программа выполняет свою обычную работу.
Самое полезное в потоках Daemon — это то, что они автоматически останавливают выполнение после завершения основной программы.
Если вам нужна короткая задача, поток Daemon прекратит выполнение после того, как вернется. Однако из-за этой природы потоки широко используются для длительных фоновых задач.
Практическая реализация
В этих примерах на Python будет использоваться модуль потоковой передачи, который является частью стандартной библиотеки.
Чтобы проиллюстрировать мощь потоков, давайте сначала создадим два потока, A и B.
Мы заставим поток A выполнить короткое вычисление, в то время как поток B будет пытаться отслеживать общий ресурс.
Обратите внимание, что оба потока являются обычными потоками.
Обратите внимание, что Daemon Thread не завершается. Это потому, что он будет автоматически убит основным потоком. Неблокирующая природа потоков делает их очень полезными для многих приложений Python.
Python на примере демона уведомления о новых коммитах Git
Работая в команде я люблю быть в курсе активности участников. Поэтому было решено написать демона наблюдающего за поступлением новых коммитов в репозиторий git’а. Так как я работаю в Ubuntu, то уведомление было реализовано встроенным способом — библиотекой libnotify.
Язык — Python!
В статье упоминается:
1. Демон на Python;
2. Логирование на Python;
3. Хранение конфигурационных файлов программ на Python;
4. Работа с командами ОС из скриптов Python;
5. Получения списка последних изменений из git’а;
6. Стандартные всплывающие уведомления Ubuntu.
Для реализации задачи был выбран язык Python (высокоуровневый, интерпретируемый, объектно-ориентированный и расширяемый язык программирования), так как я его не знаю.
Для начала мне очень помогли два источника:
— официальная документация: http://docs.python.org/tutorial/index.html;
— цикл статей IBM на русском языке: https://www.ibm.com/developerworks/ru/library/l-python_part_1/.
Во время изучения основ, приступаем к написанию программы.
1. Демон
В сети встречается много реализаций демонов, выбрал один из готовых с положительными отзывами и привлекательным названием: http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/. У этого демона были проблемы с завершением работы командой «daemon.py stop» вот в этом месте:
Это как видно возникло это из-за русской локали, фраза «No such process» в моей системе возвращалась на русском языке. Простой способ исправить — удалить эту проверку:
2. Ведение логов
Простейшим средством оповещение о процессе работы программы является использование функции print(). Но эта программа будет запускаться в качестве демона и не предполагает вывод информации о своем состоянии в консоль запуска. Удобным вариантом в этом случае является запись лога в файл. В Python’е есть встроенный способ логирования входящий в стандартную библиотеку — модуль logging (http://docs.python.org/library/logging.html).
Модуль имеет множество вариантов ведения лога (handlers, http://docs.python.org/library/logging.handlers.html): StreamHandler, FileHandler, WatchedFileHandler, RotatingFileHandler, TimedRotatingFileHandler, SocketHandler, DatagramHandler, SysLogHandler, NTEventLogHandler, SMTPHandler, MemoryHandler, HTTPHandler. Для контроля работы демона использовался FileHandler:
3. Хранение конфигурации программ на Python
Для хранения конфигурации приложений используется ini файл и встроенный модуль работы с ними ConfigParser (http://docs.python.org/library/configparser.html):
Получение значения параметров функциями (в данном случае получение integer значения):
4. Работа с командам ОС из скриптов Python
Для выполнения системных команд используется метод check_output() модуля subprocess (http://docs.python.org/library/subprocess.html):
Также можно использовать методы модуля os:
Документация рекомендует использовать subprocess.
Daemon Thread в Python
Чтобы начать работу с этим руководством, вы должны иметь базовые знания о потоках. В основном есть два типа, один из них – daemon, другой – non-daemon.
non-daemon, блокирует выход основной программы. daemon запускается, не блокируя выход из основной программы. И когда основная программа в Python завершается, связанные с ней потоки также уничтожаются.
Пример
У нас есть простая программа, в которой мы создаем два потока. Выполнение одного из них займет больше времени, потому что мы добавили 2 секунды сна. Давайте запустим приведенную ниже программу и посмотрим на результат.
Вы получите результат, как показано ниже.
Таким образом, оба потока выполняются, а затем основной поток завершает работу и программу.
Теперь мы сделаем Thread a, как daemon. Тогда вы увидите разницу в результатах. Итак, давайте отредактируем предыдущий код следующим образом.
Обратите внимание на дополнительный аргумент daemon = True при создании потока a. Вот как мы указываем поток, как Daemon Thread в Python. На изображении ниже показан результат работы программы.
Обратите внимание, что программа завершается, даже если Daemon Thread был запущен.
Когда нужен Daemon Thread?
В большом проекте некоторые потоки предназначены для выполнения фоновых задач, таких как отправка данных, периодическая сборка мусора и т.д. Это может быть выполнено no-Daemon. Но если используется no-Daemon, основной поток должен отслеживать их вручную. Однако, используя Daemon Thread, основной поток может полностью забыть об этой задаче, и эта задача будет либо завершена, либо уничтожена при выходе из основного потока.
Обратите внимание, что вы должны использовать Daemon Thread только для несущественных задач, когда вы не возражаете, если она не завершится или останется между ними.
Потоки демонов в Python – Что это такое и как их создавать?
Привет всем! В сегодняшнем посте мы рассмотрим использование потоков демонов в Python. Прежде чем мы начнем с основной темы, давайте посмотрим, что такое демон
Привет всем! В сегодняшнем посте мы рассмотрим использование потоков демонов в Python. Прежде чем мы начнем с основной темы, давайте сначала посмотрим, что такое поток демонов!
Потоки демонов
Поток демона – это тип потока, который может работать независимо в фоновом режиме. Эти типы потоков выполняются независимо от основного потока. Поэтому они называются неблокирующими потоками.
Когда вам могут понадобиться потоки демонов в Python?
Предположим, вам нужна длительная задача, которая пытается прочитать файлы журналов. Эта задача должна предупреждать пользователя при обнаружении сообщения об ошибке в журналах.
Мы можем назначить поток демона для этой задачи, который может продолжать отслеживать ваши файлы журналов, в то время как наша основная программа выполняет свою обычную работу!
Самое лучшее в потоках демонов заключается в том, что они автоматически останавливают выполнение после завершения основной программы!
В случае, если вам нужна короткая задача, поток демона остановит выполнение после ее возвращения. Однако из-за такой природы потоки демонов широко используются для длительных фоновых задач.
Теперь давайте рассмотрим пример, который показывает, как мы можем использовать их в Python!
Использование потоков демонов в Python – Практическая реализация
Чтобы проиллюстрировать мощь потоков демонов, давайте сначала создадим два потока, A и B.
Мы заставим поток A выполнить короткое вычисление, в то время как поток B попытается контролировать общий ресурс.
Обратите внимание, что оба потока являются обычными потоками. Теперь давайте сделаем поток B потоком демона. Посмотрим, что будет дальше.
Здесь обратите внимание, что поток демона не завершается. Это происходит потому, что он автоматически будет убит основным потоком.
Неблокирующий характер потоков демонов делает его очень полезным для многих приложений Python.
Вывод
В этой статье мы узнали о том, как мы можем использовать потоки демонов в нашем приложении Python
Как вы создаете демон в Python?
Тем не менее, другой пример кода, хотя и не содержит так много документации, содержит пример кода для передачи таких команд, как начать, остановить и перезапустить. Он также создает PID-файл, который может быть полезен для проверки, запущен ли демон и т. Д.
Оба примера объясняют, как создать демон. Есть ли какие-то дополнительные вещи, которые необходимо учитывать? Один образец лучше другого и почему?
15 ответов
Текущее решение
Исторический ответ
Возможно, это не прямой ответ на вопрос, но systemd можно использовать для запуска приложения в качестве демона. Вот пример:
Я предпочитаю этот метод, потому что большая часть работы сделана для вас, и тогда ваш скрипт-демон работает так же, как и вся ваша система.
Вот мой базовый демон Python ‘Howdy World’, с которого я начинаю, когда разрабатываю новое приложение-демон.
После нескольких лет и многих попыток (я попробовал все ответы, приведенные здесь, но все они имели незначительные недостатки в конце), теперь я понимаю, что есть лучший способ, чем запуск, остановка, перезапуск демона непосредственно из Python : используйте вместо этого инструменты ОС.
Например, для Linux вместо python myapp start и python myapp stop я делаю это для запуска приложения:
Подключить к этому терминалу снова. Оказавшись в терминале, можно использовать CTRL + C, чтобы остановить его.
В 80% случаев, когда люди говорят «демон», им нужен только сервер. Поскольку вопрос в этом вопросе совершенно неясен, трудно сказать, какой может быть область возможных ответов. Поскольку сервер достаточно, начните с него. Если фактический «демон» действительно необходим (это редко), прочитайте nohup как способ демонизации сервера.
До тех пор, пока фактический демон фактически не требуется, просто напишите простой сервер.
предотвращение дампов ядра (многие демоны запускаются от имени root, а дампы ядра могут содержать конфиденциальную информацию)
вести себя правильно внутри chroot тюрьмы
установить UID, GID, рабочий каталог, umask и другие параметры процесса соответственно для варианта использования
закройте все дескрипторы открытых файлов, с исключениями в зависимости от варианта использования
установить обработчики сигналов для разумного поведения демона, а также с определенными обработчиками, определенными в зависимости от варианта использования
обрабатывать PID-файл как совместную консультативную блокировку, которая представляет собой целое банку червей в себе со многими противоречивыми, но обоснованными способами поведения
разрешить надлежащую очистку после завершения процесса
фактически становится процессом демона, не приводя к зомби
Эта функция преобразует приложение в демон:





