При многих блокирующих I/O-операциях CPython освобождает GIL. Пока один поток ждёт сеть или диск, другой может исполнять Python-код или начать своё ожидание.
Почему всё-таки работает многопоточность с IO-bound задачами, несмотря на GIL?
При многих блокирующих I/O-операциях CPython освобождает GIL. Пока один поток ждёт сеть или диск, другой может исполнять Python-код или начать своё ожидание.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
При многих блокирующих I/O-операциях CPython освобождает GIL. Пока один поток ждёт сеть или диск, другой может исполнять Python-код или начать своё ожидание.
Поэтому несколько запросов к независимым внешним сервисам могут завершаться быстрее, чем последовательная обработка. Это перекрытие ожиданий, а не одновременное исполнение Python-байткода несколькими ядрами в обычной GIL-сборке.
Если после получения данных основное время уходит на CPU-обработку Python, ускорение ограничено. Библиотека также должна корректно освобождать GIL на ожидании. Ограничивайте число потоков, задавайте timeout и защищайте разделяемое состояние: наличие GIL не заменяет бизнес-синхронизацию.