Как в Python реализована работа с потоками и в чем их главная особенность

«Как в Python реализована работа с потоками и в чем их главная особенность» — вопрос из категории Операционные системы, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Последствия GIL:

  • Для I/O-bound задач (работа с сетью, файлами): Потоки эффективны. Пока один поток ждет ответа от сети, GIL освобождается, и другой поток может выполнять свою работу.
  • Для CPU-bound задач (вычисления): Потоки не дают прироста производительности на многоядерных системах, так как только одно ядро может быть утилизировано в один момент времени. Для таких задач следует использовать модуль multiprocessing.

Пример создания потока:

import threading
import time

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

# Создаем и запускаем поток
thread = threading.Thread(target=worker, args=("Worker-1",))
thread.start()

print("Главный поток продолжает работу")

# Ожидаем завершения дочернего потока
thread.join()

print("Программа завершена")

Ключевые моменты:

  • Общая память: Потоки разделяют общее пространство памяти, что упрощает обмен данными, но требует механизмов синхронизации (Lock, Semaphore) для предотвращения состояния гонки.
  • Демонические потоки: Потоки, созданные с флагом daemon=True, автоматически завершаются при выходе из основного потока.