Sobes.tech
Назад к вопросам
Junior — Middle
59

Можете объяснить, что такое GIL и как оно влияет на работу потоков в Python?

Компании, где спрашивали
WildberriesWildberries
МТСМТС
Soft Media Group
Код Открытия
ООО КМВ Тур
Баланс-ПлатформаБаланс-Платформа
Норси-Транс

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

GIL — это глобальная блокировка интерпретатора Python, из-за которой в CPython одновременно исполняется только один поток Python-кода. Это не значит, что потоки бесполезны, но для CPU-bound задач они обычно не дают линейного ускорения. При этом для I/O-bound сценариев потоки остаются полезными, потому что часто освобождают CPU во время ожидания ввода-вывода.

Определение:

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

Важно понимать: GIL влияет на потоки внутри одного процесса именно в CPython. Для других реализаций Python поведение может отличаться.

Пример использования:

Если программа много читает данные из сети, диска или ждёт ответа от базы данных, потоки могут ускорить обработку за счёт переключения во время ожидания.

import threading
import requests

urls = [
    "https://example.com",
    "https://example.org",
    "https://example.net",
]

def fetch(url):
    response = requests.get(url)
    print(url, response.status_code)

threads = [threading.Thread(target=fetch, args=(url,)) for url in urls]

for t in threads:
    t.start()

for t in threads:
    t.join()

Пояснение кода:

Код не требует сложного разборa, здесь важно показать поведение потоков на I/O-bound задаче.

  1. Для каждой ссылки создаётся отдельный поток.
  2. Потоки запускаются почти одновременно.
  3. Пока один поток ждёт ответ от сети, другой может выполняться.
  4. Из-за GIL одновременно не выполняется несколько участков Python-байткода, но ожидание сети освобождает время для других потоков.
  5. Поэтому в таких задачах потоки могут дать реальный выигрыш по времени.

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

  • GIL есть в CPython и ограничивает одновременное исполнение Python-байткода.
  • Потоки не ускоряют CPU-bound вычисления, если они написаны на чистом Python.
  • Для I/O-bound задач потоки полезны: сеть, файловые операции, ожидание БД.
  • Если нужна параллельная CPU-нагрузка, обычно используют multiprocessing, native extensions или вынесение тяжёлых вычислений вне Python-байткода.
  • GIL не означает отсутствие многопоточности; он означает ограничение на параллельное выполнение именно Python-кода.