Многопроцессорная передача позволяет программе выполнять несколько задач одновременно, создавая отдельные процессы. Каждый процесс имеет свою собственную память и интерпретатор Python, который позволяет полностью использовать несколько сердечников CPU. Async_apply и Apply — это два метода, предоставленные Python’s Multiprocessing.pool для выполнения параллельных задач.
Прежде чем мы погрузимся в технические объяснения этих методов, давайте поговорим о магазине. Магазин механика. Представьте себе магазин механика с четырьмя ремонтными отсеками. Так же, как CPU, в каждом заливе есть своя собственная команда механиков. Менеджер (основная глобальная блокировка переводчика [GIL] потока) назначает автомобили в каждом заливе на основе различных потребностей.
С подачей заявки менеджер отправляет машину в конкретный залив. Этот автомобиль — редкий коллекционер, и очень важно, чтобы он был отремонтирован в нетронутом состоянии как можно быстрее. Ремонт происходит в его собственном заливе, работая независимо и параллельно с главным офисом, хотя менеджер ждет и не назначает другие автомобили в течение этого времени. Вместо того, чтобы назначать другие автомобили в оставшиеся бухты, менеджер наблюдает за автомобилем коллекционера, в то время как все остальные в магазине находятся в режиме ожидания. Как только автомобиль коллекционера будет отремонтирован и проверен, работа возвращается к его нормальному потоку.
С Apply_async все работают одновременно. Когда автомобили прибывают, они немедленно назначаются в бухты. Несколько механиков работают на разных автомобилях одновременно, заканчивая и осматривая каждый автомобиль, прежде чем вернуть его владельцу вскоре после завершения. Все заливы работают параллельно.
Применяется ли для вас просто просто старый синхронный код?
Зачем использовать метод применения?
Внешность может быть обманчивым. Применить на самом деле способ запустить синхронный код в отдельном процессе. В то время как основная программа ожидает завершения задачи, фактическая работа происходит независимо на отдельном процессоре. Точно так же, как автомобиль редкого коллекционера, ремонтируемый в своем собственном заливе, в то время как менеджер приостанавливает другие обязанности, применение выполняет задачу в отдельном процессе, даже если основная программа ждет, пока она не будет выполнена.
Итак, зачем использовать Apply вместо того, чтобы запускать код непосредственно в основном потоке, если он все равно будет синхронным? Есть четкие преимущества. Запуск задачи в отдельном процессоре позволяет тяжелой работе, изолированной от памяти и среды основной программы. Это предотвращает сбои или замедление в основной программе, хотя основная программа не продолжается до завершения задачи.
Apply — это мощный инструмент, когда у вас есть одна важная задача, которая должна быть выполнена, прежде чем двигаться дальше, и вы хотите запустить его изолированно. Отладка, обработка изображений и видео, сжатие файлов или шифрование и анализ данных — все это хорошие примеры такого рода работы.
Синтаксис применения
- Func: целевая функция для выполнения.
- ARGS: кортеж позиционных аргументов.
- KWDS: Словарь аргументов ключевых слов.
Пример с использованием Apply
Этот код создает пул с двумя рабочими процессами. Вызов Apply запускает функцию Square на отдельном процессе с входом 4. Основная программа ждет результата, который составляет 16, а затем печатает его. Только одна задача работает, и программа блокирует, пока она не закончится.
Вывод: результат с применением: 16.
Что такое метод Apply_async?
Apply_async — это то, о чем большинство людей думают, когда они изображают процессы, работающие параллельно, например, несколько автомобилей, над которыми работают одновременно.
Apply_async запускает функцию асинхронно, что означает, что она немедленно возвращает Asyncresult объект, и основная программа может продолжать запускать другой код, в то время как процесс выполняется в фоновом режиме. Эти задачи работают на отдельных процессорах параллельно и не блокируют основную программу во время завершения. Как правило, они также не требуют результатов других процессов для начала.
Синтаксис Apply_async
- Func: функция для выполнения.
- Арг: кортеж аргументов.
- KWDS: Словарь аргументов ключевых слов.
- Вызов: необязательная функция для вызова, когда результат готов.
Пример Apply_async
Этот код создает пул с двумя рабочими процессами. Вызов Apply_async отправляет квадратную функцию и ввод 4 в отдельный процесс, но он не ждет результата сразу. Вместо этого он немедленно возвращает Asyncresult объект.
Программа печатает сообщение и продолжает запускать другой код. Когда он вызывает .get (), он ждет и получает результат, который составляет 16. Задача работает параллельно, а основная программа остается отзывчивой во время запуска.
Вывод: выполнение другой работы во время запуска процессов …
Результат с Apply_async: 16.
Сравнение Apply_async против Apply: Performance
Вспомните магазин механика: каждый залив — это собственное рабочее пространство, а команды, работающие бок о бок, не садится друг на друга. Однако, когда магазин должен получить несколько автомобилей одновременно, назначение их в разные бухты гораздо более эффективно, чем заняться их один за другим.
Как мы рассмотрели выше, Apply_async и Apply — это два очень разных типа многопроцессорной работы, используемых для разных случаев использования, и работают по -разному. Чтобы подтвердить основные различия, применить синхронно и блокирует основную программу, пока функция не вернется. Apply_async является асинхронным и не блокирует основную программу.
Практическое сравнение скорости
При выполнении многих задач Apply_async может быть быстрее в целом, потому что это позволяет выполнять задачи параллельно. Для отдельных задач производительность в основном одинакова, поскольку оба метода запускают работу в отдельном процессе.
Пример производительности: единственная задача
Здесь Apply () и Apply_async () в основном эквивалентны в общее время, потому что вы запускаете только одну задачу.
Оба должны занять приблизительно две секунды.
Пример производительности: несколько задач
В приведенном ниже коде Apply_async () быстрее, потому что задачи выполняются параллельно.
Выходы будут отличаться в зависимости от вашей системы, но вы должны увидеть, что время завершения применения значительно больше, чем время Apply_async при выполнении нескольких задач.
Сравнение Apply_async против Apply: Best Practices и Erdations для использования.
Примеры производительности подтверждают важность выбора Async_apply вместо применения, действительно зависит от того, что вариант использования, а не от характеристик производительности самих методов.
Когда использовать применить
- Вы обрабатываете один большой файл CSV и нуждаетесь в очищенных данных, прежде чем перейти к следующему шагу.
- Вы хотите зашифровать файл и не можете продолжить, пока он не будет надежно записан на диск.
- Вы используете научный расчет, который должен закончить до начала следующего расчета.
- Вы отлаживаете сложную функцию и хотите запустить ее изолированно, но все же проходите через остальную часть вашего кода в порядке.
Когда использовать Apply_async
- У вас есть каталог изображений для изменения размера, и вы хотите обработать их все одновременно.
- Вам нужно отбрасывать десятки веб -страниц параллельно и собрать результаты, когда они будут готовы.
- Вы тренируете несколько моделей машинного обучения (ML) с различными параметрами и хотите использовать все ваши ядра процессора для ускорения.
- Вы используете несколько симуляций, которые не зависят друг от друга, и вы хотите сразу их снять.
Если ваш рабочий процесс является последовательным, и результаты должны быть обработаны немедленно, применить просто и ясен. Если ваши задачи независимы, и вы заботитесь о том, чтобы закончить быстрее, Application_async поможет вам получить максимальную отдачу от вашего оборудования.
Понимание обработки результатов
Обработка результатов относится к тому, как ваша программа получает, управляет и использует выходы из задач, которые вы выполняете в многопроцестрой.
Управление результатами с применением
Обработка результатов от Apply () проще. С помощью Application () результаты возвращаются немедленно, потому что основная программа ожидает завершения задачи. Это означает, что вы можете использовать или назначить результат сразу же в следующей строке кода.
В приведенном ниже примере кода функция func работает в отдельном процессе с входом 4. Вызов Apply () ожидает завершения функции, а затем возвращает результат напрямую. Этот результат присваивается результату переменной и напечатано немедленно.
Управление результатами с Async_Apply
Обработка результатов с Async_Apply () немного сложнее, так как многие задачи выполняются одновременно. С помощью Application_async () вы получаете Asyncresult объект и должны вызовать .get (), когда вы будете готовы получить результат.
Вы также можете передать обратный вызов для обработки результатов, как только они будут доступны.
В приведенном ниже примере Apply_async () запускает функцию в отдельном процессе и немедленно возвращает Asyncresult объект. Программа печатает сообщение и продолжает работать. Когда вы звоните .get () на Asyncresult, программа ждет (при необходимости) и получает результат, который затем напечатан.
Обработка ошибок и отладка
Обработка ошибок работает по -разному между Apply () и Apply_async (), и это влияет на то, как вы отлаживаете свой многопроцессный код.
Отладка с применением
Отладка с применением проще, потому что исключения, поднятые внутри функции, немедленно распространяются обратно в основную программу. Вы можете поймать и обрабатывать их прямо там, где вы называете Apply ().
Эта немедленная обратная связь облегчает отладку (), поскольку ваша программа делает паузу и рассказывает вам об ошибках, как только они произойдут.
Отладка с Async_Apply
Отладка с помощью Apply_async является более сложной, потому что ошибки происходят асинхронно в фоновом процессе. Исключение не появится до тех пор, пока вы не позвоните .get () на Asyncresult, который повторно использует исключение в основной программе.
Поскольку исключения отображаются только при запросе результата, отладка асинхронного кода может быть сложнее. Возможно, вы не знаете, что что -то пошло не так до позднего вечера, и вы должны помнить, чтобы поймать ошибки при вызове .get ().
Общие советы по отладке многопроцессорного кода
Поймать исключения с помощью Try-except raight .get () в Apply_async ()-один из распространенных и эффективных способов отладки асинхронных задач, но это не единственный способ. Как правило, это лучшая отправная точка для захвата ошибок, исходящих из фоновых процессов.
Другие советы включают:
- Добавление ведения журнала внутри рабочих функций для отслеживания прогресса и выявления проблем.
- Использование меньших испытательных входов для изоляции задач.
- Запустить вашу функцию без многопроцессы сначала, чтобы убедиться, что она работает правильно.
- Тщательно проверяя, что аргументы и данные, передаваемые между процессами, являются сериализуемыми.
- Наблюдая за тупиками или вешанными, вызванными неправильно ожиданием результатов.
Обычные ошибки и ловушки
Ошибки легко допустить при работе с многопроцестрой. Многопроцестра, будь то синхронная или асинхронная, немедленно добавляет другой слой сложности в ваш код. Одной из наиболее распространенных ошибок является забывание вызовать .get () при использовании Application_async (). Если вы пропустите его, вы никогда не получите свой результат, и ваша программа может закончить, не обрабатывая ваши данные.
Другая ошибка, которая часто случается при использовании Async_Apply (), не обрабатывает исключения должным образом. Всегда оберните вызовы .get () в блок попытки за исключением, чтобы вы могли поймать и понять любые ошибки, которые возникают в ваших рабочих процессах.
Другая частая ловушка, которая применяется как к Apply (), так и Async_Apply () не закрывает пул должным образом. Всегда используйте блок с помощью Pool () для безопасного управления вашими процессами, или убедитесь, что вы называете Pool.Close (), за которым следует pool.join () для очистки.
Заключение ключевые выводы
- Применить () синхронно и блокирует до тех пор, пока не сделано.
- Apply_async () является асинхронным, что позволяет одновременно выполнять.
- Используйте Apply_async для лучшей производительности в параллельных рабочих нагрузках.
- В случае использования будет направлено вас при принятии решения о использовании async_apply против Apply.
- Всегда тщательно управляйте результатами и исключениями.
Следующие шаги для оптимизации многопроцессы
Пришло время поближе взглянуть на вашу систему, так как реальная сила многопроцессорной работы сводится к тому, как используются сердечные цены на процессоре. Чтобы повысить производительность, настройте количество процессов в зависимости от того, сколько ядер у вашей машины может получить максимальную отдачу от своего оборудования, не перегружая его. Это также хорошая идея, чтобы профилировать ваши рабочие нагрузки, чтобы обнаружить любые узкие места и при необходимости отрегулировать ваш подход.
Trending Stories youtube.com/thenewstack Tech движется быстро, не пропустите эпизод. Подпишитесь на наш канал YouTube, чтобы транслировать все наши подкасты, интервью, демонстрации и многое другое. Группа подпишитесь с эскизом. Джессика Вахтел — писатель по маркетингу разработчиков в InfluxData, где она создает контент, который помогает сделать данные о мире временных рядов более понятными и доступными. Джессика имеет опыт работы в разработке программного обеспечения и технической журналистике. Подробнее от Джессики Вахтел