Рубрики
Без рубрики

Потоки демонов в Python – Что это такое и как их создавать?

Привет всем! В сегодняшнем посте мы рассмотрим использование потоков демонов в Python. Прежде чем мы начнем с основной темы, давайте посмотрим, что такое демон

Автор оригинала: 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

Рекомендации