Подтвердить что ты не робот

Ошибочны ли потоки Python?

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

4b9b3361

Ответ 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 операций и сохранить все хорошо и под контролем.