Некоторое время назад узнал об одной особенности реализации языка
Python, которая меня жутко огорчила — это
GIL (Global Interpreter Lock).
Весь недостаток от использования GIL можно выразить очень просто: вся Python-программа выполняется в одном потоке и не будет распараллеливаться на многопроцессорных системах. Да, даже при использовании threads, предоставляемых самим языком.
Что в этом плохого? Пока вы работаете на однопроцессорной машине — ничего. Но когда у вас многопроцессорная машина, или многоядерный процессор — вот тут и всплывают все недостатки. Сколько бы у вас ни было свободных процессоров, готовых перемолоть любую программу, скрипт на Python будет выполняться только одним процессором. Хотя в нём самом могут работать много thread-ов, выполняющие долгие вычисления.
Вообще же, мы вступили в эпоху роста процессоров “вширь”. Тактовую частоту уже сложно прибавить, поэтому приходится ставить много ядер. 8 августа 2008 года Intel полностью прекратит производство одноядерных процессоров. Проявляются новые архитектуры многоядерных процессоров
Cell и другие. Таким образом, совсем скоро наступит время, когда число ядер в микропроцессорах будет начинаться с двух, четырёх, восьми... А это приводит нас к необходимости создавать приложения, способные эффективно использовать все преимущества многоядерных процессоров. Приложений, которые будут хорошо распараллеливаться и задействовать каждое ядро для своих целей.
А тут вот такая неприятность с Python. При чём, GIL будет актуален ещё и в разрабатываемой версии Python 3k.
Гвидо Ван Руссо, создатель языка, на этот счёт
говорит примерно следующее:
Если у вас несколько CPU и вы желаете использовать каждый из них, то создавайте столько процессов, сколько у вас процессоров. Если Вам действительно нужна “честная” многопоточность в Python, используйте Jython или IronPython; JVM и CLR имеют поддержку многопроцессорных потоков. Конечно, будьте готовы к взаимным блокировкам, livelock, race condition и всем другим “прелестям”, сопровождающим многопоточный код.
Да, действительно, используя реализацию языка на Java (
Jython), мы избавляемся от недостков связанных с GIL. Поскольку там thread-ы будут честно распараллеливаться на разные ядра процессора. Однако, есть и недостатки. Во-первых, Jython пока реализует лишь Python версии 2.2 и 2.3 (и это на кануне выхода версии 2.6 и новой версии 3.0!), а второй недостаток связан с использованием JVM — это относительно долгое время старта приложения (2.4 секунды против 80 мс для обычного Python-скрипта).
Вот такие вот дела.
На сколько мне известно, язык Ruby так же подвержен недостаткам, связанным с GIL.
Так что, для программирования серьёзных задач нужно выбирать серьёзный язык.