Search
Write a publication
Pull to refresh

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 состоит из трёх операций:

  1. Загрузка переменной и константы в стек.

  2. Сложение и запись результата в стек.

  3. Запись результата в переменную.

Sign up to leave a comment.

Articles