Ответ
В 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для более простых задач, где нужно просто выполнить набор функций в отдельных потоках и получить результат.