Потоки-демоны в Python
В этой статье вы узнаете, что такое потоки-демоны и как их эффективно использовать в Python.
В Python у каждой программы есть как минимум один поток — главный поток. Чтобы создать программу, у которой будет больше одного потока, используется модуль threading
. Используя несколько потоков в программе, вы можете выполнять задачи параллельно.
Иногда выполнить задачу задачу нужно в фоновом режиме. Для этого используется специальный вид потока — поток-демон.
Потоки-демоны — это потоки, которые выполняют задачи в фоновом режиме.
Потоки-демоны полезны для таких выполнения задач:
- Запись информации в файл в фоновом режиме.
- Скраппинг содержимого веб-сайта в фоновом режиме.
- Автоматическое сохранение данных в базе данных в фоновом режиме.
Создание потока-демона
Чтобы создать поток-демон, в конструкторе Thread
нужно указать аргумент daemon=True
:
t = Thread(target=f, deamon=True)
Это также можно сделать после создания экземпляра Thread
— достаточно установить свойство daemon
равным True
.
t = Thread(target=f)
t.deamon = True
Пример недемонического потока
Давайте создадим поток, не являющийся демоном, который показывает количество секунд ожидания программы:
from threading import Thread
import time
def show_timer():
count = 0
while True:
count += 1
time.sleep(1)
print(f'Прошло {count} секунд...')
t = Thread(target=show_timer, daemon=True)
t.start()
answer = input('Вы хотите выйти?\n')
Как это работает
1. Создадим функцию show_timer()
, которая отображает количество секунд ожидания программы.
2. Создадим новый поток, выполняющий функцию show_timer()
:
t = Thread(target=show_timer)
3. Начинаем поток:
t.start()
4. Вызываем функцию input()
, чтобы попросить пользователя ввести данные:
answer = input('Вы хотите выйти?\n')
Если вы запустите программу, она будет работать вечно.
Вывод
Вы хотите выйти?
Прошло 1 секунд...
Прошло 2 секунд...
Прошло 3 секунд...
Прошло 4 секунд...
Y
Прошло 5 секунд...
Прошло 6 секунд...
Чтобы завершить программу, нужно закрыть терминал.
Программа работает неопределенно долго, потому что поток t
является недемоническим потоком. Программа должна дождаться завершения всех недемонических потоков, прежде чем она сможет выйти.
Пример потока-демона
Теперь давайте превратим поток, с которым разбирались выше, в поток-демон:
from threading import Thread
import time
def show_timer():
count = 0
while True:
count += 1
time.sleep(1)
print(f'Пршло {count} секунд...')
t = Thread(target=show_timer, daemon=True)
t.start()
answer = input('Вы хотите выйти?\n')
Если запустить программу, ввести что-то и нажать Enter, программа завершится.
Вывод
Вы хотите выйти?
Прошло 1 секунд...
Y
Программа завершается, потому что ей не нужно ждать завершения работы потока-демона. Кроме того, поток-демон автоматически завершается при выходе программы.
Потоки демоны и недемонические потоки: отличия
Критерий сравнения | Поток-демон | Недемонический поток |
Создание потока | t = Thread(target=f, daemon=True) |
t = Thread(target=f) |
Программа ждет завершения перед выходом | Нет | Да |
Для каких задач подходит | Некритичные. Например, запись логов | Критичные |
Что нужно запомнить
- Поток-демон — это поток, который выполняет задачи в фоновом режиме.
- Потоки-демоны полезны для выполнения задач, которые не являются критическими.
- Программа не ждет завершения работы потока-демона перед завершением.
- При завершении программы поток-демон автоматически завершается.