Comments 2
Основной способ — использовать C-расширения, но такой вариант подходит не всем, поэтому в небольших проектах часто прибегают к процессам и асинхронности.
В мире принятого PEP734 (subinterpreters) не рассказать о них - преступление!
Довольно подробно GIL в 3.2 разобрано в этом видео: Understanding the Python GIL.
Все таки наверное 3.3 если вы упоминаете это видео в разделе про 3.3.
Условие if — внутри if-а находится проверка флага
eval_breaker
. Если он установлен в true, поток прекращает выполнение байт-кода и освобождает GIL, об этом поговорим ниже.
Это давно уже не так. eval_breaker
содержит различные биты, которые управляют разными функциями.
Теоретически проблему можно решить, добавив отдельную блокировку ко всем структурам данных, которые могут использоваться разными потоками. Но это решение неэффективно, так как есть риск взаимоблокировок — ситуации, когда два или более потока ждут друг друга, захватив разные ресурсы, и ни один из них не может продолжить работу.
Так весь PEP703 (free-threading build) как раз про это.
По истечении 5 мс устанавливается флаг
gil_drop_request = 1
, который заставляет первый поток остановиться. Второй поток снова вызываетcv_wait()
.
Упоминания gil_drop_request
остались только в комментариях.
В целом не понятно о какой версии вы говорите.
За попытку плюс, за остальное - так себе.
Так ли работает интерпретатор в питоне? А где создание новой версии "x"? Он же неизменяемый.
Например, код x += 1 состоит из трёх операций:
Загрузка переменной и константы в стек.
Сложение и запись результата в стек.
Запись результата в переменную.
Как работает GIL и как от него избавиться