Выбор ответа Senior GIL, потоки и процессы обновлено

Когда CPython переключает потоки

Вопрос

Как CPython решает, когда поток, выполняющий чистый Python-код без I/O, должен отдать GIL другим?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: По интервалу переключения (по умолчанию 5 мс) по запросу ждущего. С Python 3.2 используется интервал переключения: если другой поток ждёт GIL дольше интервала, текущий получает запрос отпустить его в ближайшей безопасной точке между инструкциями.

Варианты ответа

  1. После каждой байткод-инструкции, по очереди между потоками
  2. По интервалу переключения (по умолчанию 5 мс) по запросу ждущегоправильный ответ
  3. Только когда поток завершится или явно вызовет time.sleep
  4. ОС прерывает поток и забирает GIL принудительно в любой момент

Разбор

С Python 3.2 используется интервал переключения: если другой поток ждёт GIL дольше интервала, текущий получает запрос отпустить его в ближайшей безопасной точке между инструкциями. Переключение после каждой инструкции было бы слишком дорогим, а «до завершения» означало бы отсутствие конкурентности. ОС планирует потоки, но выполнять байткод может только владелец GIL.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.