Выбор ответа Senior GIL, потоки и процессы обновлено
Когда CPython переключает потоки
Вопрос
Как CPython решает, когда поток, выполняющий чистый Python-код без I/O, должен отдать GIL другим?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: По интервалу переключения (по умолчанию 5 мс) по запросу ждущего. С Python 3.2 используется интервал переключения: если другой поток ждёт GIL дольше интервала, текущий получает запрос отпустить его в ближайшей безопасной точке между инструкциями.
Варианты ответа
- После каждой байткод-инструкции, по очереди между потоками
- По интервалу переключения (по умолчанию 5 мс) по запросу ждущегоправильный ответ
- Только когда поток завершится или явно вызовет
time.sleep - ОС прерывает поток и забирает GIL принудительно в любой момент
Разбор
С Python 3.2 используется интервал переключения: если другой поток ждёт GIL дольше интервала, текущий получает запрос отпустить его в ближайшей безопасной точке между инструкциями. Переключение после каждой инструкции было бы слишком дорогим, а «до завершения» означало бы отсутствие конкурентности. ОС планирует потоки, но выполнять байткод может только владелец GIL.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.