Потоки-демоны в 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)
Программа ждет завершения перед выходом Нет Да
Для каких задач подходит Некритичные. Например, запись логов Критичные

Что нужно запомнить

  • Поток-демон — это поток, который выполняет задачи в фоновом режиме.
  • Потоки-демоны полезны для выполнения задач, которые не являются критическими.
  • Программа не ждет завершения работы потока-демона перед завершением.
  • При завершении программы поток-демон автоматически завершается.
codechick

СodeСhick.io - простой и эффективный способ изучения программирования.

2024 ©