Какие основные инструменты для многопоточности используются в Python?

Ответ

В Python для реализации многопоточности, в основном для I/O-bound задач, используются инструменты из стандартной библиотеки. Главным ограничением является Global Interpreter Lock (GIL), который не позволяет нескольким потокам одновременно выполнять Python байт-код на многоядерных CPU.

1. Модуль threading

Это низкоуровневый модуль для прямого управления потоками.

  • threading.Thread: Основной класс для создания потока.
  • Примитивы синхронизации: Lock, RLock, Semaphore, Event для предотвращения состояний гонки (race conditions) при доступе к общим данным.

Пример:

import threading
import time

def worker(name):
    print(f"Поток {name} начал работу")
    time.sleep(1)
    print(f"Поток {name} завершил работу")

threads = []
for i in range(3):
    # Создаем и запускаем поток
    t = threading.Thread(target=worker, args=(i,))
    threads.append(t)
    t.start()

# Ожидаем завершения всех потоков
for t in threads:
    t.join()

print("Все потоки завершены")

2. Модуль concurrent.futures

Это высокоуровневый интерфейс для асинхронного выполнения задач, который упрощает работу с пулами потоков.

  • ThreadPoolExecutor: Управляет пулом потоков, автоматически распределяя задачи.

Пример:

import concurrent.futures
import time

def worker(name):
    time.sleep(1)
    return f"Результат от потока {name}"

# Создаем пул из 3 потоков
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
    # Отправляем задачи на выполнение
    futures = [executor.submit(worker, i) for i in range(3)]

    # Получаем результаты по мере готовности
    for future in concurrent.futures.as_completed(futures):
        print(future.result())

Вывод:

  • Используйте threading для полного контроля над жизненным циклом потоков и сложной синхронизации.
  • Используйте concurrent.futures.ThreadPoolExecutor для более простых задач, где нужно просто выполнить набор функций в отдельных потоках и получить результат.