Рубрики
Без рубрики

Python 3 параллелия – модуль CONDUROND.

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

chapulent.futures Модуль был добавлен в Python 3.2. Согласно документации Python IT Предоставляет разработчику с интерфейсом высокого уровня для асинхронно выполняющих озвонок. В основном Chapularent.futures – это абстракция слоя на вершине резьбы и многопроцессорных модулей Python, которые упрощают их. Однако следует отметить, что в то время как уровень абстракции упрощает использование этих модулей, он также удаляет много своей гибкости, поэтому, если вам нужно сделать что-то настраиваемое, то это может быть не лучший модуль для вас.

CONDUROND.FUTURES включает в себя абстрактный класс под названием Исполнитель Отказ Он не может быть использован напрямую, поэтому вам нужно будет использовать один из двух двух подклассов: ThreadPoolexecutor или ProcessPoolExecutor Отказ Как вы, наверное, догадались, эти два подкласса сопоставляются с резьбой и многопроцессорными APIS Python соответственно. Обе эти подклассы предоставят пул, который вы можете поместить потоки или процессы в.

Термин Будущее имеет особое значение в информатике. Это относится к конструкции, которая может быть использована для синхронизации при использовании методов одновременного программирования. Будущее на самом деле способ описать результат процесса или потока, прежде чем он завершит обработку. Мне нравится думать о них как о ожидании результата.

Создание пула

Создание пула работников чрезвычайно легко, когда вы используете модуль CONDUROND.FUTURES. Давайте начнем, переписывая наш код загрузки из моего Asyncio Статья Так что теперь он использует модуль CONDURING. Вот моя версия:

Во-первых, мы делаем импорт, который нам нужен. Тогда мы создаем наши Загрузчик функция. Я пошел дальше и немного обновил его, так что оно проверяет, имеет ли URL-адрес в конце этого. Если это не так, то мы будем поднять RuntimeError Отказ Далее мы создаем Главная Функция, которая находится в том месте, где пул резьбы создается. Вы можете использовать Python’s с Заявление с ThreadPoolExecutor и ProcessPoolExecutor, который довольно удобно.

Во всяком случае, мы устанавливаем наш пул, чтобы у него было пять работников. Затем мы используем понимание списка для создания группы фьючерсов (или рабочих мест) и, наконец, мы называем AS_Complete функция. Эта удобная функция – это итератор, который дает фьючерсы, как они завершены. Когда они завершают, мы распечатаем результат, который является строкой, которая была возвращена из нашего функции загрузчика.

Если функция, которую мы использовали, была очень вычисления интенсивных, то мы могли бы легко поменять ThreadPoolexecutor для ProcessPooleExecuteCutor, и только один код строки.

Мы можем немного очистить этот код, используя CONDURENT.FUTURES карта метод. Давайте слегка переписаним наш бассейн, чтобы воспользоваться этим:

Основная разница здесь находится в Главная Функция, которая была уменьшена двумя строками кода. карта Метод так же, как карта Python в том, что она принимает функцию и итеративную функцию, а затем вызывает функцию для каждого элемента в Iterable. Вы также можете добавить тайм-аут для каждой из ваших потоков, чтобы он повесил, он остановится. Наконец, начиная с Python 3.5, они добавили Chunksize Аргумент, который может помочь производительности при использовании пула резьбы при очень большом количестве. Однако, если вы будете использовать Process Pool, Chunksize не будет иметь никакого эффекта.

Тупики

Один из ловушек к модулю Concularent.futures состоит в том, что вы можете случайно создавать тупики, когда вызывающий абонент ассоциируется с Будущее также ждет результатов другого будущего. Это звучит с толку, поэтому давайте посмотрим на пример:

Здесь мы импортируем класс ThreadPoolExecutor и создаем экземпляр этого. Обратите внимание, что мы устанавливаем максимальное количество работников на один нить. Затем мы отправляем нашу функцию, wait_forever Отказ Внутри нашей функции мы отправляем другую работу в пул резьбы, который предполагается на молнии двух списков вместе, получить результат этой операции и распечатать ее. Однако мы только что создали тупик! Причина в том, что у нас есть одно будущее ждать еще одного будущего, чтобы закончить. По сути, мы хотим ожидаемой операции, чтобы дождаться еще одной операции в ожидании, которая не работает очень хорошо.

Давайте немного переписам код, чтобы сделать его работать:

В этом случае мы просто вернем внутреннее будущее из функции, а затем попросите его результат. Результат звонка Результат На нашем возвращенном будущем это еще одно будущее, которое на самом деле. Если мы позвоним Результат Метод в этом вложенном будущем мы получаем Zip Возвращение объекта, так что выяснить, какой фактический результат мы обертываем ZIP с Python’s Список функция и распечатайте ее.

Упаковка

Теперь у вас есть другой аккуратный инструмент параллелизма для использования. Вы можете легко создавать нить или разрабатывать пулы в зависимости от ваших потребностей. Если вам нужно будет запустить процесс, который является связанным в сети или ввода/вывода, вы можете использовать класс пула резьбы. Если у вас есть вычислительно тяжелая задача, то вы захотите использовать класс Process Pool. Просто будьте осторожны с тем, чтобы позвонить над фьючерсом, или вы можете получить тупик.

Связанное чтение