Есть ли такая вещь, как рабочие потоки в Python? - PullRequest
3 голосов
/ 07 декабря 2010

Я написал прекрасный многопоточный скрипт, и когда я его запустил, он работал хуже с 25 потоками, чем при прямом вызове обработчика потоков.

Затем я обнаружил глобальную блокировку интерпретатора.Я хочу спросить, прежде чем я откажусь от python для этого скрипта и переписываю что-то в другом месте, есть ли какой-нибудь способ сделать настоящую многопоточность в python?

Ответы [ 5 ]

8 голосов
/ 07 декабря 2010

Другой подход состоит в том, чтобы отказаться от потоков и вместо этого использовать модуль Multiprocessing (Python 2.6+), который обходит GIL и имеет API, который, по крайней мере, аналогичен API в модуле потоков.

3 голосов
/ 07 декабря 2010

Теперь это интересный вопрос - я не думаю, что в прямом CPython есть выход из GIL.

Stackless Python должен улучшить производительность "параллелизма" по сравнению с CPython сон использует микропотоки , но я не думаю, что он ускользает от GIL.

Кроме того, согласно странице GIL на python.org , Jython и IronPython donнет GIL.

1 голос
/ 08 декабря 2010

Правильный ответ во многом зависит от того, что вы делаете.

Сильно связанные с CPU (и блокирующие IO) задачи, такие как сжатие и рендеринг изображений, обычно выполняются с собственным кодом и собственными библиотеками.обычно освобождают GIL, пока они работают, что допускает параллелизм.Когда вы можете изолировать работу, интенсивно использующую процессор, с узким собственным вызовом, вы получаете параллелизм, собственную производительность, где она имеет значение, и удобство написания большей части кода на Python.

Не весь код имеет такой маленький размер,изолируемые блоки вычислительного кода, которые могут быть аккуратно реализованы в нативной библиотеке, но многое делают.

0 голосов
/ 07 декабря 2010

Вы можете попробовать модуль multiprocessing , если это применимо к вашей проблеме.

0 голосов
/ 07 декабря 2010

В CPython (реализация Python на C) нет, насколько мне известно.(Если я ошибаюсь, поправьте меня, я бы наверняка хотел узнать, существует ли решение!).

Возможно, вы захотите заинтересоваться IronPython (.NET) или JPython (Java / JWM),Я не использовал их, но я считаю, что по крайней мере один из них поддерживает потоки, родные для данной среды выполнения.

...