2009-10-18 2 views
8

Я часто вижу, как люди говорят, что GIL на Python Interpreter (даже здесь, в stackoverflow).Действительно ли Python GIL на переводчика?

Но то, что я вижу в исходном коде, похоже, что GIL является глобальной переменной, и поэтому в каждом процессе python имеется один GIL для всех интерпретаторов. Я знаю, что они сделали это, потому что объект интерпретатора не прошел, как lua ​​или TCL, он просто не был хорошо разработан в начале. И локальное хранилище потоков, по-видимому, не переносимо для парней python.

Это правильно? Я кратко рассмотрел версию 2.4, которую я использую в проекте здесь.

Если бы это было изменено в более поздних версиях, особенно в версии 3.0?

ответ

7

GIL действительно является процессом, а не интерпретатором. Это не изменяется в 3.x.

0

Я считаю, что это правда (по крайней мере, с Python 2.6), что каждый процесс может иметь не более одного встроенного интерпретатора CPython (другие среды выполнения могут иметь разные ограничения). Я не уверен, что это проблема с GIL как таковой, но, скорее всего, это связано с глобальным состоянием или для защиты от противоречивого глобального состояния в сторонних модулях C. Из CPython API Docs:

[Py ___ Initialize()] является не оп при вызове во второй раз (без вызова Py_Finalize() первый). Нет возвратного значения; это фатальная ошибка, если инициализация завершилась неудачей.

Возможно, вас заинтересует проект Unladen Swallow, цель которого в конечном итоге полностью удалить GIL из CPython. Другое время выполнения Python вообще не имеет GIL, например (я считаю) Stackless Python и, конечно, Jython.

Также обратите внимание, что GIL является still present in CPython 3.x.

+1

Многие проекты удалили GIL из CPython раньше. Недостаток ласточки не первый. Однако они не работали так же хорошо, как версия GIL, поэтому никто их не использовал. – nosklo

+1

Кроме того, stackless не удаляет GIL. Фактически, любая операция блокировки в любом бесконтактном микропотоке блокирует все приложение. – nosklo

+0

И Jython настолько медленный, что он непригодный для использования - если вы просто не используете его для скриптового плагина для java-программы, где большая часть работы выполняется на Python. – Lothar

2

Возможно, путаница возникает, потому что большинство людей полагает, что на Python имеется один интерпретатор для каждого процесса. Я помню, как читал, что поддержка нескольких переводчиков через API C была в основном непроверенной и почти никогда не использовалась. (И когда я дал это, не работает должным образом.)