Ответ
Да, модуль threading
в Python создает и использует нативные потоки операционной системы. Каждый threading.Thread
соответствует реальному потоку, управляемому планировщиком ОС.
Однако в CPython (стандартной реализации Python) существует Global Interpreter Lock (GIL).
Что такое GIL? Это мьютекс (механизм блокировки), который позволяет только одному потоку выполнять байт-код Python в один момент времени в рамках одного процесса.
Практические последствия:
- Для CPU-bound задач (интенсивные вычисления): Потоки не дают прироста производительности на многоядерных процессорах, так как GIL не позволяет им работать параллельно.
- Для I/O-bound задач (ожидание сети, диска): Потоки очень эффективны. Пока один поток ждет ответа от сети, GIL освобождается, и другой поток может выполнять свою работу.
Пример:
import threading
import time
def io_bound_task():
print("Начало I/O задачи...")
time.sleep(1) # Имитация ожидания ответа от сети
print("...I/O задача завершена")
# Создаем и запускаем поток, который будет управляться ОС
thread = threading.Thread(target=io_bound_task)
thread.start()
print("Основной поток продолжает работу, пока другой ждет.")
thread.join() # Ожидаем завершения фонового потока
Для достижения истинного параллелизма в CPU-bound задачах в Python следует использовать модуль multiprocessing
, который создает отдельные процессы со своим собственным GIL.