Потоки Python глючат? - PullRequest
       18

Потоки Python глючат?

27 голосов
/ 29 августа 2008

Один надежный друг-программист сказал мне, что текущая многопотоковая реализация Python серьезно глючит - этого достаточно, чтобы вообще не использовать его. Что может сказать об этом слухе?

Ответы [ 6 ]

56 голосов
/ 29 августа 2008

Потоки Python хороши для параллельного программирования ввода-вывода . Потоки выгружаются из ЦП, как только они блокируют ожидание ввода из файла, сети и т. Д. Это позволяет другим потокам Python использовать ЦП, пока другие ждут. Это позволит вам написать многопоточный веб-сервер или веб-сканер, например.

Однако потоки Python сериализуются GIL при входе в ядро ​​интерпретатора. Это означает, что если два потока занимаются сокращением числа, в любой момент может работать только один поток. Это также означает, что вы не можете использовать преимущества многоядерных или многопроцессорных архитектур.

Существуют такие решения, как одновременный запуск нескольких интерпретаторов Python с использованием библиотеки потоков на основе Си. Это не для слабонервных, и польза может не стоить хлопот. Будем надеяться на полное решение Python в следующем выпуске.

16 голосов
/ 29 августа 2008

Стандартная реализация Python (обычно известная как CPython в том виде, в каком она написана на C) использует потоки ОС, но поскольку существует Global Interpreter Lock , только Python одновременно может запускать Python код. Но в рамках этих ограничений библиотеки потоков надежны и широко используются.

Если вы хотите использовать несколько процессорных ядер, есть несколько вариантов. Одним из них является одновременное использование нескольких интерпретаторов Python, как уже упоминалось другими. Другой вариант - использовать другую реализацию Python, которая не использует GIL. Два основных варианта: Jython и IronPython .

Jython написан на Java и в настоящее время является достаточно зрелым, хотя некоторые несовместимости остаются. Например, веб-фреймворк Django еще не работает идеально , но все время приближается. Jython отлично подходит для безопасности потоков , выходит на лучше в тестах и имеет дерзкое сообщение для тех, кто хочет GIL .

IronPython использует .NET Framework и написан на C #. Совместимость достигает стадии, когда Django может работать на IronPython (по крайней мере, в качестве демонстрации), и есть руководства по использованию потоков в IronPython .

9 голосов
/ 29 августа 2008

GIL (Global Interpreter Lock) может быть проблемой, но API вполне в порядке. Попробуйте отличный модуль processing, который реализует API потоков для отдельных процессов. Я использую это прямо сейчас (хотя и в OS X, еще предстоит провести некоторое тестирование в Windows) и действительно впечатлен. Класс Queue действительно экономит мое бекон с точки зрения управления сложностью!

РЕДАКТИРОВАТЬ : похоже, что модуль обработки включен в стандартную библиотеку начиная с версии 2.6 (import multiprocessing). Радость!

5 голосов
/ 29 августа 2008

Насколько я знаю, реальных ошибок нет, но производительность при многопоточности в cPython действительно плохая (по сравнению с большинством других реализаций многопоточности, но обычно достаточно хороша, если все большинство потоков имеют блокировку) из-за GIL (глобальная блокировка интерпретатора), поэтому на самом деле это зависит от реализации, а не от языка. Jython, например, не страдает от этого из-за использования модели потока Java.

См. этот пост о том, почему на самом деле невозможно удалить GIL из реализации cPython, и это для некоторой практической проработки и обходных путей.

Сделайте быстрый поиск в Google для "Python GIL" для получения дополнительной информации.

2 голосов
/ 23 февраля 2009

Если вы хотите написать код на python и получить отличную поддержку потоков, вы можете попробовать IronPython или Jython. Поскольку код Python в IronPython и Jython работает на .NET CLR и Java VM соответственно, они пользуются великолепной поддержкой потоков, встроенной в эти библиотеки. Кроме того, в IronPython отсутствует GIL, что не позволяет потокам CPython в полной мере использовать преимущества многоядерных архитектур.

0 голосов
/ 29 августа 2008

Я использовал его в нескольких приложениях и никогда не слышал и не слышал о том, чтобы многопоточность была чем-то иным, кроме 100% надежности, если вы знаете ее пределы. Вы не можете порождать 1000 потоков одновременно и ожидать, что ваша программа будет работать должным образом в Windows, однако вы можете легко написать рабочий пул и просто передать ему 1000 операций, и все держать под контролем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...