Действительно ли потоки Python являются багги?

Вы можете вызвать метод get() в AsyncTask (или перегруженный get(long, TimeUnit) ). Этот метод будет блокироваться до тех пор, пока AsyncTask не завершит свою работу, и в этот момент он вернет вам Result.

Было бы разумно выполнять другую работу между созданием / запуском вашего асинхронного задание и вызов метода get, в противном случае вы не используете задачу async очень эффективно.

27
задан Peter Mortensen 10 September 2010 в 22:32
поделиться

6 ответов

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

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

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

58
ответ дан Peter Mortensen 28 November 2019 в 04:14
поделиться

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

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

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

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

16
ответ дан tzot 28 November 2019 в 04:14
поделиться

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

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

9
ответ дан Daren Thomas 28 November 2019 в 04:14
поделиться

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

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

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

5
ответ дан Henrik Gustafsson 28 November 2019 в 04:14
поделиться

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

2
ответ дан m-sharp 28 November 2019 в 04:14
поделиться

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

-2
ответ дан tslocum 28 November 2019 в 04:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: