Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: switch, interval, gil

Как происходит переключение потоков при наличии GIL?

Этот вопрос проверяет, понимаете ли вы, почему потоки “перемешиваются” в выполнении и какие события заставляют CPython отдавать GIL другому потоку.

Короткий ответ

В CPython потоки переключаются, потому что один поток периодически освобождает GIL, и другой может его захватить. Это происходит по таймеру (интервал переключения) и в точках, где поток уходит ждать I/O. То есть операционная система планирует потоки, но выполнять Python-байткод реально может только тот, кто держит GIL. Поэтому вы видите “конкуренцию” потоков, но не настоящий параллелизм байткода.

Длинный ответ

Важно понимать общую картину: потоков может быть много, но байткод исполняет только один поток, который сейчас держит GIL. Переключение — это момент, когда GIL переходит к другому потоку.

Определение

Определение: Переключение потоков при GIL — ситуация, когда текущий поток освобождает GIL (добровольно или вынужденно), и другой поток захватывает его, продолжая выполнение байткода.

Основные причины, когда GIL “отдают”

Перед началом перечисления подчеркну: это не одна причина, а несколько типичных триггеров.

  1. Таймер переключения (switch interval)

    • CPython старается регулярно давать шанс другим потокам.

    • Интервал можно настраивать через sys.setswitchinterval(seconds).

  2. Ожидание I/O

    • Когда поток вызывает операцию, которая долго ждет (например, чтение из сети), интерпретатор обычно отпускает GIL, чтобы другие потоки могли работать.

  3. C-расширения могут отпускать GIL

    • Если тяжелая часть выполняется в C и разработчик расширения предусмотрел освобождение GIL, другие потоки могут исполнять байткод параллельно с этой C-работой (но это уже “частный случай”).

Как это ощущается в программах

  1. CPU-bound

    • Потоки будут часто “переключаться”, но суммарно работать почти как один поток (накладные расходы даже могут ухудшить время).

  2. I/O-bound

    • Пока один поток ждет, другие реально делают полезную работу, поэтому потоки часто дают ускорение.

Небольшой пример: влияние switch interval

import sys
import threading

sys.setswitchinterval(0.001)  # чаще переключаться

def ping(name):
    for _ in range(5):
        print(name)

t1 = threading.Thread(target=ping, args=("A",))
t2 = threading.Thread(target=ping, args=("B",))
t1.start(); t2.start()
t1.join(); t2.join()
# Вывод будет “перемешанным” из-за переключений

Важные нюансы

  • Планировщик ОС решает, какой поток “готов” выполняться, но GIL решает, кто реально выполняет Python-код.

  • Переключения не гарантируют “честность”: один поток может получать GIL чаще, чем другой, в зависимости от нагрузки и поведения кода.

Вывод

Переключение потоков при GIL происходит, когда CPython регулярно или вынужденно освобождает GIL (таймер, ожидание I/O, C-код), поэтому потоки выглядят конкурентными, но байткод исполняется по очереди.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • Python

    Python

Ключевые слова

#switch

#interval

#gil

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.