Перейти к содержанию

Начало урока

Параллелизм: потоки и GIL

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

Главная идея: Поток позволяет одному процессу Python делать несколько дел, пересекающихся во времени. Но CPython защищает свои внутренности одним мьютексом — глобальной блокировкой интерпретатора (GIL): в любой момент байткод Python выполняет только один поток. Поэтому потоки дают реальное ускорение для I/O-bound работы (ожидание сети, диска или базы данных), но почти ничего не дают для CPU-bound работы. Как только два потока трогают одни и те же изменяемые данные, вы обязаны сериализовать этот доступ через Lock, иначе получите состояние гонки.
К концу вы сможете:
  • отличать конкурентность от параллелизма,
  • запускать и присоединять потоки модулем threading,
  • объяснить, что GIL гарантирует и чего он стоит,
  • решать, когда потоки помогают (I/O-bound), а когда нет (CPU-bound),
  • замечать состояние гонки и чинить его через Lock или with lock:,
  • использовать ThreadPoolExecutor и queue.Queue вместо ручного управления потоками.

1. Конкурентность это не параллелизм

Конкурентность это способ построить программу так, чтобы несколько задач были в процессе одновременно — их можно чередовать на одном ядре, и каждая по очереди продвигается понемногу. Параллелизм это когда задачи буквально выполняются в один и тот же момент на нескольких ядрах. Конкурентность про то, чтобы справляться со многими вещами; параллелизм про то, чтобы делать многое одновременно. Потоки в CPython дают конкурентность; из-за GIL они редко дают параллелизм для чисто питоновской CPU-работы.

Это различие ключ ко всей теме. Потоки позволяют программе ждать много вещей сразу — двадцать открытых сокетов, десять файлов, пять HTTP-запросов — так что общее время по часам сходится к самому долгому одиночному ожиданию, а не к сумме всех. Чего они не могут, так это ускорить один тяжёлый по CPU питоновский цикл.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя