Daemon Threads: потоки-демоны в Python
Краткое описание: в этом руководстве вы узнаете о daemon threads (потоках-демонах) в Python и о том, как их эффективно использовать.
- Что такое потоки-демоны в Python?
- Создание daemon thread
- Пример потока демона
- Отличия потоков-демонов от потоков, не являющихся демонами
Что такое потоки-демоны в Python?
В Python каждая программа имеет хотя бы один поток, называемый основным потоком. Чтобы создать программу, имеющую более одного потока, вы используете модуль threading. Используя несколько потоков, вы можете выполнять задачи одновременно.
Иногда вам может потребоваться выполнить задачу в фоновом режиме. Для этого вы используете особый вид потока, называемый потоком-демоном. Потоки-демоны по определению являются фоновыми потоками.
Данные потоки полезны для выполнения задач, которые поддерживают потоки, не являющиеся демонами, в программе. Например:
- Запись информации в файл в фоновом режиме.
- Удаление содержимого веб-сайта в фоновом режиме.
- Автоматическое сохранение данных в базу данных в фоновом режиме.
Создание daemon thread
Чтобы создать поток-демон, вы устанавливаете для демона значение True в конструкторе потока:
t = Thread(target=f, deamon=True)
Альтернативно, вы можете установить для свойства демона значение 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'Has been waiting for {count} second(s)...') t = Thread(target=show_timer) t.start() answer = input('Do you want to exit?\n')
Как это работает.
- Сначала определите функцию show_timer(), которая отображает количество секунд ожидания программы.
- Во-вторых, создайте новый поток, который выполняет функцию show_timer():
t = Thread(target=show_timer)
В-третьих, запустите тему:
t.start()
- Наконец, вызовите функцию input(), чтобы предложить пользователям ввести данные:
answer = input('Do you want to exit?\n')
Если вы запустите программу, она покажет следующий вывод и будет работать вечно.
Do you want to exit?Has been waiting for 1 second(s)... Has been waiting for 2 second(s)... Has been waiting for 3 second(s)... Has been waiting for 4 second(s)... Y Has been waiting for 5 second(s)... Has been waiting for 6 second(s)...
Программа работает бесконечно, поскольку поток t не является потоком-демоном. Программе необходимо дождаться завершения всех потоков, не являющихся демонами, прежде чем она сможет выйти.
Теперь давайте превратим этот поток в поток-демон:
from threading import Thread import time def show_timer(): count = 0 while True: count += 1 time.sleep(1) print(f'Has been waiting for {count} second(s)...') t = Thread(target=show_timer, daemon=True) t.start() answer = input('Do you want to exit?\n')
Если вы запустите программу, введете что-нибудь и нажмете Enter, программа завершится. Например:
Do you want to exit? Has been waiting for 1 second(s)... Y
Программа завершает работу, поскольку ей не нужно ждать завершения потока-демона. Кроме того, поток-демон автоматически завершается при выходе из программы.
Отличия потоков-демонов от потоков, не являющихся демонами
В следующей таблице показаны различия между потоками-демонами и потоками, не являющимися демонами:
Демонические потоки | Потоки, не являющиеся демонами | |
---|---|---|
Создание темы | t = Thread(target=f, daemon=True) | t = Thread(target=f) |
Программе необходимо подождать перед выходом | Нет | Да |
Вид задач | Не критично, как logging | Критично |