Надежный друг-кодер сказал мне, что текущая многопоточная реализация Python является серьезной ошибкой - достаточно, чтобы вообще не использовать ее. Что можно сказать об этом слухе?
Ошибочны ли потоки Python?
Ответ 1
Нити Python хороши для параллельного программирования ввода/вывода. Потоки выгружаются из ЦП, как только они блокируют ожидание ввода из файла, сети и т.д. Это позволяет другим потокам Python использовать процессор, в то время как другие ждут. Это позволит вам написать многопоточный веб-сервер или веб-искатель, например.
Однако потоки Python сериализуются GIL, когда они входят в ядро интерпретатора. Это означает, что если два потока хрустят, только один может работать в любой момент. Это также означает, что вы не можете использовать многоядерные или многопроцессорные архитектуры.
Существуют такие решения, как одновременное использование нескольких интерпретаторов Python, с использованием библиотеки потоков на основе C. Это не для слабонервных, и выгоды могут не стоить проблем. Позвольте надеяться на все решения Python в будущей версии.
Ответ 2
Стандартная реализация Python (обычно называемая CPython, поскольку она написана на C) использует потоки ОС, но поскольку существует Global Interpreter Lock, только один поток за раз разрешает запуск кода Python. Но в рамках этих ограничений библиотеки потоков очень надежны и широко используются.
Если вы хотите иметь возможность использовать несколько ядер процессора, есть несколько вариантов. Один из них заключается в одновременном использовании нескольких интерпретаторов python, как упоминалось другими. Другой вариант - использовать другую реализацию Python, которая не использует GIL. Два основных варианта: Jython и IronPython.
Jython написан на Java, и теперь он довольно зрелый, хотя некоторые несовместимости остаются. Например, веб-фреймворк Django еще не работает отлично, но все время становится все ближе. Jython отлично подходит для безопасности потоков, выходит лучше в тестах и имеет нахальное сообщение для тех, кто хочет GIL.
IronPython использует платформу .NET и написан на С#. Совместимость достигает стадии, когда Django может работать на IronPython (по крайней мере, в качестве демонстрации), и есть руководства по использованию потоков в IronPython.
Ответ 3
Возможно, проблема с GIL (Global Interpreter Lock), но API вполне нормально. Попробуйте отличный модуль processing
, который реализует API Threading для отдельных процессов. Я использую это прямо сейчас (хотя и на OS X, еще не нужно тестировать на Windows), и я действительно впечатлен. Класс Queue действительно сохраняет мой бекон с точки зрения управления сложностью!
EDIT: кажется, что модуль обработки включен в стандартную библиотеку версии 2.6 (import multiprocessing
). Радость!
Ответ 4
Насколько я знаю, нет реальных ошибок, но производительность при потоковом в cPython действительно плохой (по сравнению с большинством других реализаций потоковой передачи, но обычно достаточно хорош, если все большинство потоков выполняются блоком) из-за GIL (Global Interpreter Lock), так что это скорее конкретная реализация, а не специфическая для языка. Jython, например, не страдает от этого из-за использования модели потока Java.
См. это сообщение о том, почему не представляется возможным удалить GIL из реализации cPython и this для некоторой практической разработки и обходных решений.
Для получения дополнительной информации сделайте быстрый google для Python GIL.
Ответ 5
Если вы хотите закодировать в python и получить отличную поддержку потоковой передачи, вы можете проверить IronPython или Jython. Поскольку код python в IronPython и Jython выполняется на .NET CLR и Java VM соответственно, они пользуются большой поддержкой потоковой передачи, встроенной в эти библиотеки. В дополнение к этому, IronPython не имеет GIL, это проблема, которая предотвращает использование потоков CPython в полной мере многоядерных архитектур.
Ответ 6
Я использовал его в нескольких приложениях и никогда не слышал и не слышал о том, чтобы потоки были чем-то иным, чем 100% надежным, если вы знаете его пределы. Вы не можете создавать 1000 потоков одновременно и ожидать, что ваша программа будет работать должным образом в Windows, однако вы можете легко написать рабочий пул и просто подать 1000 операций и сохранить все хорошо и под контролем.