Можете ли вы участвовать в гонках в Python, пока есть GIL?
Насколько я понимаю, из-за Глобальной блокировки интерпретатора в cPython в любой момент времени может быть выполнен только один поток. Означает ли это, или это автоматически не защищено от условий гонки, таких как проблема потерянного обновления?
Просто чтобы прояснить, я прошу с теоретической точки зрения. Я бы никогда не написал многопоточный код без синхронизации.
1 ответ
Благодаря GIL на каждый процесс активен только один поток для выполнения байт-кода Python; цикл оценки байт-кода защищен им.
Замок открывается каждый sys.getcheckinterval()
байтовые коды, в которых может происходить переключение потоков. Это означает, что для кода Python переключение потоков все же может иметь место, но только между инструкциями байтового кода. Любой код, который опирается на безопасность потоков, должен это учитывать. Действия, которые могут быть выполнены в одном байт-коде, могут быть потокобезопасными, все остальное - нет.
Даже инструкция однобайтового кода может вызвать другой код Python; например линия object[index]
может вызвать __getitem__
вызов пользовательского класса, реализованного в Python. Таким образом, один BINARY_SUBSCR
Код операции не обязательно является потокобезопасным, в зависимости от типа объекта.