Вы можете вызвать метод get()
в AsyncTask
(или перегруженный get(long, TimeUnit)
). Этот метод будет блокироваться до тех пор, пока AsyncTask
не завершит свою работу, и в этот момент он вернет вам Result
.
Было бы разумно выполнять другую работу между созданием / запуском вашего асинхронного задание и вызов метода get
, в противном случае вы не используете задачу async очень эффективно.
Потоки Python хороши для параллельное программирование ввода-вывода. Потоки подкачиваются из ЦП, как только они блокируют ожидание входа из файла, сети, и т.д. Это позволяет другим потокам Python использовать ЦП, в то время как другие ожидают. Это позволило бы Вам писать многопоточный веб-сервер или поисковый робот, например.
Однако потоки Python сериализируются GIL, когда они вводят ядро интерпретатора. Это означает, что, если два потока производят подсчеты, только один может работать в любой данный момент. Это также означает, что Вы не можете использовать в своих интересах многоядерные или многопроцессорные архитектуры.
существуют решения как выполнение нескольких интерпретаторов Python одновременно, с помощью C, базирующегося, распараллеливая библиотеку. Это не для слабонервных, и преимущества не могли бы стоить проблемы. Давайте надеяться на все решение Python в будущем выпуске.
Стандартная реализация Python (общеизвестный как CPython, как это записано в C) использует потоки ОС, но так как существует Глобальная Блокировка Интерпретатора , только одному потоку за один раз позволяют выполнить код Python. Но в рамках тех ограничений, библиотеки поточной обработки устойчивы и широко используются.
, Если Вы хотите быть в состоянии использовать несколько ядер процессора, существует несколько опций. Нужно использовать несколько интерпретаторов Python одновременно, как упомянуто другими. Другая опция состоит в том, чтобы использовать различную реализацию Python, который не использует GIL. Две основных опции Jython и IronPython.
Jython записан в Java и теперь довольно зрел, хотя некоторые несовместимости остаются. Например, веб-платформа Django отлично еще не работает , но становится ближе все время. Jython большой для потокобезопасности , выходит лучше в сравнительных тестах и имеет развязное сообщение для тех, которые желают GIL.
IronPython использует платформу.NET и записан в C#. Совместимость достигает стадии, где Django может работать на IronPython (по крайней мере, как демонстрация) и существует руководства по использованию потоков в IronPython.
GIL (Глобальная Блокировка Интерпретатора) мог бы быть проблемой, но API довольно в порядке. Испытайте превосходное processing
модуль, который реализует API Поточной обработки для отдельных процессов. Я использую это прямо сейчас (хотя на OS X, должны все же сделать некоторое тестирование в Windows), и действительно впечатлен. Класс Очереди действительно убирается подобру-поздорову с точки зрения руководящей сложности!
РЕДАКТИРОВАНИЕ : кажется, что модуль обработки включается в стандартную библиотеку с версии 2.6 (import multiprocessing
). Радость!
Насколько я знаю, что нет никаких реальных ошибок, но производительность, когда поточная обработка в cPython действительно плоха (по сравнению с большинством других реализаций поточной обработки, но обычно достаточно хороша, если все большинство потоков делают, является блоком) из-за GIL (Глобальная Блокировка Интерпретатора), поэтому действительно это - конкретная реализация, а не конкретный язык. Jython, например, не страдает от этого из-за использования модели потока Java.
Видят этот сообщение на том, почему не действительно выполнимо удалить GIL из cPython реализации, и это для некоторой практической разработки и обходных решений.
Делают быстрый Google для "Python GIL" для получения дополнительной информации.
Если Вы хотите кодировать в Python и получить большую поддержку поточной обработки, Вы могли бы хотеть проверить IronPython или Jython. Так как код Python в IronPython и Jython работает на CLR.NET и Java VM соответственно, они пользуются большой поддержкой поточной обработки, встроенной в те библиотеки. В дополнение к этому IronPython не имеет GIL, проблемы, которая препятствует тому, чтобы потоки CPython в полной мере пользовались многоядерной архитектурой.
Я использовал его в нескольких приложениях и никогда не имел, ни слышал о поточной обработке быть чем-либо кроме надежных 100%, пока Вы знаете его пределы. Вы не можете породить 1 000 потоков одновременно и ожидать, что Ваша программа будет работать правильно в Windows, однако можно легко записать объединение рабочего и просто подать его 1 000 операций и сохранить все хорошим и под управлением.