Получить доступ

Нужны ли блокировки в многопоточном Python-коде, если есть GIL?

MiddleКонкурентность
Ещё спрашивают так:
  • Потокобезопасна ли операция x += 1 в Python?
  • Какие операции в Python атомарны?
Коротко

Нужны: GIL защищает внутренние структуры интерпретатора, а не ваши инварианты. x += 1 — несколько инструкций байткода (прочитать, сложить, записать), и поток может быть прерван между ними — обновления теряются. Общие изменяемые данные защищают threading.Lock или передают через queue.Queue.

  • Отдельные операции над list и dict (append, d[k] = v) атомарны в CPython — но это деталь реализации
  • Проверить-и-изменить (if k not in d: d[k] = ...) — гонка
  • В free-threaded сборке (3.13+) гонок станет больше, а не меньше

А ещё Лучший способ — не делить изменяемое состояние: очереди и неизменяемые данные

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Что на самом деле делает GIL. В каждый момент байткод выполняет один поток, но переключение возможно между любыми инструкциями (по умолчанию каждые 5 мс). counter += 1 компилируется примерно в LOAD, BINARY_OP +=, STORE — два потока читают 5, оба пишут 6.

import threading
counter = 0
lock = threading.Lock()

def inc():
    global counter
    for _ in range(100_000):
        with lock:
            counter += 1

Без with lock итог при нескольких потоках может быть меньше ожидаемого.

Атомарность в CPython. Одиночные операции, реализованные одной инструкцией на C (list.append, dict[key] = value, deque.popleft), атомарны благодаря GIL. Но полагаться на это хрупко: сочетание двух атомарных операций уже не атомарно, а в сборке без GIL гарантии обеспечиваются по-другому.

Инструменты: Lock, RLock (реентерабельный), Condition, Semaphore, Event; queue.Queue — потокобезопасная очередь, лучший способ передавать работу между потоками.

Что хотят услышать

  • GIL не защищает пользовательские данные.
  • Почему x += 1 не атомарен.
  • Lock и Queue.

Частые ошибки

  • «Из-за GIL гонок в Python не бывает».

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем