Багатопоточність

Клас Thread

Клас Thread — основний клас для створення і керування потоками. У нього є 4 основних методи:

  • start(): Запускає виконання потоку.
  • join(): Поточний потік призупиняється і чекає завершення запущеного потоку.
  • is_alive(): Повертає True, якщо потік виконується.
  • run(): Метод, що містить код, який буде виконуватися в потоці. Перевизначається при наслідуванні від класу Thread
import threading

def worker(number, text):
    print(f"Worker {number}: {text}")

# Створення нового потоку з аргументами
t = threading.Thread(target=worker, args=(1, "Hello")) # створили новий об'єкт потоку
t.start() # Запустили потік
t.join() # Очікуємо завершення потоку

Клас Timer

Клас Timer в модулі threading призначений для запуску функції через заданий проміжок часу. Цей клас корисний для виконання відкладених завдань у багатопоточному середовищі.

Таймер створюється і ініціалізується за допомогою функції, яку необхідно викликати, і часу затримки в секундах.

  • Метод start() запускає таймер, який відраховує заданий проміжок часу, а потім викликає вказану функцію.
  • Метод cancel() дозволяє зупинити таймер, якщо він ще не спрацював. Це корисно для запобігання виконанню функції, якщо таймер більше не потрібен.
import threading

def greet(name):
    print(f"Hello, {name}!")

# Створення таймера з аргументами
t = threading.Timer(3.0, greet, args=["Alice"])
t.start()  # Запуск таймера

# Зупинка таймера до виконання
t.cancel()

Клас ThreadLocal

Клас ThreadLocal призначений для створення потоків, у яких є свої власні локальні дані. Це корисно в багатопоточних додатках, коли кожен потік повинен мати свою версію даних, щоб уникнути конфліктів і проблем синхронізації.

import threading
# Створення об'єкта ThreadLocal
user_data = threading.local()
def process_request(user):
    # Присвоєння значення локальної змінної потоку
    user_data.user = user
    handle_request()

def handle_request():
    # Доступ до локальної змінної потоку
    print(f'Handling request for user: {user_data.user}')

threads = []
users = ['Alice', 'Bob', 'Charlie']
for user in users:
    t = threading.Thread(target=process_request, args=(user,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()
2015-2026 © SumyNikNet