Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

Насколько я знаю, реальных ошибок нет, но производительность при многопоточности в cPython действительно плохая (по сравнению с большинством других реализаций многопоточности, но обычно достаточно хорошая, если все большинство потоков имеют блокировку) из-за < a href = "http://docs.python.org/api/threads.html" rel = "noreferrer"> GIL (глобальная блокировка интерпретатора), поэтому на самом деле это зависит от реализации, а не от языка. Jython, например, не страдает от этого из-за использования модели потока Java.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top