Автор оригинала: Pankaj Kumar.
Привет всем! В сегодняшнем посте мы рассмотрим использование потоков демонов в Python. Прежде чем мы начнем с основной темы, давайте сначала посмотрим, что такое поток демонов!
Потоки демонов
Поток демона – это тип потока, который может работать независимо в фоновом режиме. Эти типы потоков выполняются независимо от основного потока. Поэтому они называются неблокирующими потоками.
Когда вам могут понадобиться потоки демонов в Python?
Предположим, вам нужна длительная задача, которая пытается прочитать файлы журналов. Эта задача должна предупреждать пользователя при обнаружении сообщения об ошибке в журналах.
Мы можем назначить поток демона для этой задачи, который может продолжать отслеживать ваши файлы журналов, в то время как наша основная программа выполняет свою обычную работу!
Самое лучшее в потоках демонов заключается в том, что они автоматически останавливают выполнение после завершения основной программы!
В случае, если вам нужна короткая задача, поток демона остановит выполнение после ее возвращения. Однако из-за такой природы потоки демонов широко используются для длительных фоновых задач.
Теперь давайте рассмотрим пример, который показывает, как мы можем использовать их в Python!
Использование потоков демонов в Python – Практическая реализация
В этих примерах в Python будет использоваться модуль потоковой передачи в Python , который является частью стандартной библиотеки.
import threading
Чтобы проиллюстрировать мощь потоков демонов, давайте сначала создадим два потока, A и B.
Мы заставим поток A выполнить короткое вычисление, в то время как поток B попытается контролировать общий ресурс.
Если для этого ресурса установлено значение True
, мы заставим поток B предупреждать пользователя о состоянии.
import threading import time # Set the resource to False initially shared_resource = False # A lock for the shared resource lock = threading.Lock() def perform_computation(): # Thread A will call this function and manipulate the resource print(f'Thread {threading.currentThread().name} - performing some computation....') shared_resource = True print(f'Thread {threading.currentThread().name} - set shared_resource to True!') print(f'Thread {threading.currentThread().name} - Finished!') time.sleep(1) def monitor_resource(): # Thread B will monitor the shared resource while shared_resource == False: time.sleep(1) print(f'Thread {threading.currentThread().name} - Detected shared_resource = False') time.sleep(1) print(f'Thread {threading.currentThread().name} - Finished!') if __name__ == '__main__': a = threading.Thread(target=perform_computation, name='A') b = threading.Thread(target=monitor_resource, name='B') # Now start both threads a.start() b.start()
Здесь Поток A установит shared_resource
в True
, и поток B будет ждать, пока этот ресурс станет истинным.
Выход
Thread A - performing some computation.... Thread A - set shared_resource to True! Thread A - Finished! Thread B - Detected shared_resource = False Thread B - Finished!
Обратите внимание, что оба потока являются обычными потоками. Теперь давайте сделаем поток B потоком демона. Посмотрим, что будет дальше.
Для этого мы можем установить его в качестве параметра в потоке .Thread(daemon=True)
метод.
import threading import time shared_resource = False # Set the resource to False initially lock = threading.Lock() # A lock for the shared resource def perform_computation(): # Thread A will call this function and manipulate the resource print(f'Thread {threading.currentThread().name} - performing some computation....') shared_resource = True print(f'Thread {threading.currentThread().name} - set shared_resource to True!') print(f'Thread {threading.currentThread().name} - Finished!') time.sleep(1) def monitor_resource(): # Thread B will monitor the shared resource while shared_resource == False: time.sleep(1) print(f'Daemon Thread {threading.currentThread().name} - Detected shared_resource = False') time.sleep(1) print(f'Daemon Thread {threading.currentThread().name} - Finished!') if __name__ == '__main__': a = threading.Thread(target=perform_computation, name='A') b = threading.Thread(target=monitor_resource, name='B', daemon=True) # Make thread B as a daemon thread # Now start both threads a.start() b.start()
Выход
Thread A - performing some computation.... Thread A - set shared_resource to True! Thread A - Finished! Daemon Thread B - Detected shared_resource = False
Здесь обратите внимание, что поток демона не завершается. Это происходит потому, что он автоматически будет убит основным потоком.
Неблокирующий характер потоков демонов делает его очень полезным для многих приложений Python.
Вывод
В этой статье мы узнали о том, как мы можем использовать потоки демонов в нашем приложении Python
Рекомендации
- Модуль потоковой передачи Python Документация
- Статья JournalDev о потоках демонов в Python