Выбор ответа Middle GIL, потоки и процессы спрашивают часто обновлено
Гонка данных при наличии GIL
Вопрос
Четыре потока по 1 000 000 раз выполняют counter += 1 для общей глобальной переменной без блокировки. Что гарантирует CPython с GIL?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Ничего: результат может быть меньше 4 000 000. counter += 1 это чтение, сложение и запись, несколько байткод-инструкций.
Варианты ответа
- Ровно 4 000 000: GIL делает
+=атомарной операцией - Ничего: результат может быть меньше 4 000 000правильный ответ
- Программа упадёт с
RuntimeErrorо гонке - Результат всегда ровно 1 000 000 из-за GIL
Разбор
counter += 1 это чтение, сложение и запись, несколько байткод-инструкций. Интерпретатор может переключить поток между ними, и два потока запишут одно и то же значение. На конкретной версии CPython потеря может проявляться редко, но гарантий нет, а во free-threaded сборке она почти неизбежна. Решение: with lock: или отказ от общего состояния. Ошибки интерпретатор не бросает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.