Назад к подготовке

Потоки, процессы, GIL и обмен данными

Чем отличаются потоки и процессы? Что такое GIL в CPython, когда нужны синхронизация и IPC?

Ответить самому

Сначала сформулируйте ответ как на собеседовании, затем откройте разбор и оцените себя.

Загрузка

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

Процессы имеют отдельную память, потоки внутри процесса делят память. GIL ограничивает одновременное исполнение Python bytecode, но не отменяет race conditions и синхронизацию.

Полный разбор

Процесс - более тяжелая единица выполнения с отдельным адресным пространством. Поток легче: он живет внутри процесса и разделяет память, файловые дескрипторы и состояние процесса, но имеет свой stack.

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

GIL не делает бизнес-инварианты атомарными. Для shared mutable state нужны Lock, Queue или другие примитивы синхронизации. Между процессами нельзя передать обычную Python-ссылку: нужны pipes, queues, sockets, shared memory, файлы, Redis или другой IPC/transport.