Прежде чем мы погрузимся в многопользовательскую и многопроцесскую, давайте сначала рассмотрим некоторую справочную информацию о параллелизме, параллелизме и асинхронных задачах. Эти три понятия связаны, но отличаются.
Давайте использовать простой пример, чтобы понять их: магазин механиков. Параллелизм происходит, когда один механик работает на нескольких автомобилях, переключаясь между ними. Например, механик меняет масло в одном автомобиле, ожидая детали для другой. Они не заканчивают одну машину, прежде чем начать следующую, но они не могут выполнять две задачи в одно и то же время. Задачи совпадают со временем, но не случаются одновременно.
Параллелизм происходит, когда несколько механиков работают на разных автомобилях одновременно. Один механик меняет масло, другой заменяет тормоза, а другой устанавливает батарею. Эти задачи происходят одновременно и могут быть выполнены в разное время или в одно и то же время, потому что разные люди справляются с ними.
Асинхронные задачи работают так: вы отбрасываете машину и получаете текст, когда это будет сделано. В то время как работа происходит, вы можете делать все, что хотите: пойти на работу, пляж или делать что -нибудь еще, и работа все еще делается на заднем плане.
Теперь к техническим объяснениям.
Быстрый ответ: асинхронные задачи используют параллелизм, но не все параллелизм является асинхронным. Параллелизм выделяется и в основном относится к использованию ЦП. Весь параллелизм включает в себя параллелизм, но не все параллелизм достигает параллелизма. Сбивает с толку? Давай продолжаем!
Длинный ответ: асинхронные задачи образуют тип параллелизма, обычно для перевязанного ввода/вывода работы. Задачи дают управление при ожидании, например, для ответа файла или сети. Это позволяет выполнять другие задачи. Параллелизм охватывает запуск нескольких задач в течение того же периода, используя потоки, Coroutines (Async/await) или другие методы. Параллелизм означает на самом деле выполнение задач одновременно на нескольких ядрах процессоров. Этот подход соответствует работе процессоров и часто использует многопроцесскую.
Почему это имеет значение для программистов Python?
Многопроцессорная и многопоточная чтения: определения и использование
MultiThreading (параллелизм) позволяет одной программе создавать несколько потоков, разделяющих одно и то же пространство памяти. Эти потоки работают одновременно, переключаясь между задачами, чтобы добиться прогресса. Многопользовательский рекорд хорошо подходит для задач ввода/вывода. Однако из -за глобальной блокировки интерпретатора Python (GIL) потоки не могут запускать байт -код Python в истинном параллели на нескольких ядрах ЦП.
Многопроцессорная (параллелизм) работает независимо от нескольких процессов. Каждый процесс имеет свое собственное пространство памяти и интерпретатор Python. Эта настройка позволяет истинно параллелизм, выполняя задачи одновременно на нескольких ядрах процессоров. Многопроцессорные подходящие задачи, связанные с процессорами, потому что они обходят ограничение GIL.
Выбор между пулами потоков и пулами процессов зависит от вашего типа задачи-будь то ввод-вывод или связанный с процессором.
Зачем нам нужно многопоточное и многопроцессорное? Познакомьтесь с Джилом Питона
GIL является механизмом CPYTHON, стандартной реализации Python. Это позволяет только один поток выполнять байт -код Python за раз, даже на многоядерных процессорах. Python представил GIL, чтобы упростить управление памятью и обеспечить безопасность потока.
Потому что GIL ограничивает выполнение потока по одному потоку за раз:
- Потоки не могут запускать Python Bytecode параллельно, что снижает их эффективность для задач, связанных с CPU, которые требуют постоянных вычислений.
Это означает:
- Когда вы используете многопоточное чтение, задачи ввода-вывода могут выполняться эффективно, потому что потоки тратят большую часть своего времени на ожидание внешних ресурсов, таких как файлы, базы данных или сетевые ответы. GIL только блокирует фактическое выполнение Python Bytecode.
- Многопроцессорная передача обеспечивает истинный параллелизм, потому что каждый процесс имеет свой собственный интерпретатор Python и GIL. Эта настройка позволяет процессовым задачам работать по нескольким ядрам.
GIL — это то, почему вы используете многопользовательскую и многопроцесскую для повышения производительности и отзывчивости в приложениях Python, когда несколько задач должны выполняться одновременно.
Синтаксис
Python предлагает несколько способов справиться с параллелизмом и параллелизмом. Двумя наиболее распространенными являются ThreadPoolexecutor и ProcessPoolexecutor. Оба предоставляют мощные абстракции, которые упрощают управление сложным параллелизмом. Эти инструменты поступают из модуля одновременного. Futures. Они помогают вам эффективно управлять асинхронными задачами.
ThreadPoolexeCutor и ProcessPoolexeCutor совместно используют один и тот же интерфейс. Это сходство облегчает переключение между ними с минимальными изменениями кода. Использование оператора с помощью оператора гарантирует, что потоки или процессы правильно убирают при завершении.
Что такое Threadpool Python? Определение и как это работает
ThreadPoolexeCutor действует как механик, быстро переключаясь между несколькими автомобилями на задачах. ThreadPoolexeCutor выполняет задачи одновременно с использованием потоков в том же процессе Python. Поскольку потоки делятся памятью, они создают и быстро переключаются.
Когда использовать ThreadPoolexeCutor
Используйте пул потоков, когда ваше приложение тратит много времени на задачи, которые не требуют большого процессора. Задачи, которые включают в себя бассейны резьбов для ожидания, так как потоки могут работать, пока другие ждут. Примеры включают:
- HTTP -запросы
- Чтение и письмо на диск
- Запросы базы данных
- Когда вам нужно ждать ввода пользователя
Пример: используя ThreadPoolexeCutor для задач ввода/вывода
Этот пример одновременно имитирует извлечение данных из нескольких URL -адресов. Каждый вызов fetch_data ждет 2 секунды, но потоки делают общее время намного короче, чем запуск.
Что такое Python Multiprocessing? Определение и как это работает
ProcessPoolexeCutor (многопроцессорная) действует как наличие нескольких механиков, каждая из которых работает на своем собственном автомобиле одновременно. Многопроцессорные задачи выполняют задачи в отдельных процессах, каждая из которых со своим собственным пространством памяти и интерпретатором Python. Это обеспечивает истинную параллельную выполнение на нескольких ядрах процессоров. В отличие от потоков, несколько механиков работают одновременно, не ожидая.
Когда использовать многопроцесс
Многопроцессорные отличия в задачах, которые вы можете распространять по нескольким ядрам. Используйте пул процессов для задач, которые потребляют много процессора. Эти задачи могут:
- Выполнить математические вычисления
- Обрабатывать большие наборы данных
- Обрабатывать изображения и видео
Пример: использование процессоров для задач переплета в процессоре
В приведенном ниже примере каждый факторный расчет требует тяжелой работы процессора. Запуск их в отдельных процессах позволяет Python обойти GIL и использовать несколько ядер.
Различия ключевых различий между потоком и многопроцестрой
Давайте оценим пулы потоков и многопроцессорную работу на основе важных критериев, чтобы помочь вам выбрать правильный подход.
- Параллелизм: Темы предлагают параллелизм, но не настоящий параллелизм из -за GIL. Процессы обеспечивают реальное параллельное выполнение.
- Обмен памятью: Темы легко делятся данными. Процессы не могут делиться памятью напрямую.
- Время стартапа: Потоки начинаются быстрее. Процессы занимают больше времени из -за накладных расходов на создание нового переводчика.
- Лучшие варианты использования: Темы соответствуют задачам ввода/вывода, таких как загрузка файлов или доступ к API. Процессы соответствуют задачам, связанным с процессорами, такими как численность, хрустящие номера или преобразование данных.
Когда использовать ThreadPoolexeCutor против ProcessPoolexeCutor
Выберите ThreadPoolexeCutor, когда:
- Ваши задачи включают в себя много ожидания.
- Вам нужен легкий параллелизм.
- Обмен памятью имеет значение.
Выберите ProcessPoolexeCutor, когда:
- Задачи требуют тяжелой работы процессора.
- Вы хотите использовать несколько ядер ЦП.
- Вам не нужно делиться памятью между задачами.
Соображения производительности и критерии измерения времени выполнения для задач ввода/вывода
В этом примере мы имитируем задачи ввода/вывода, спит в течение нескольких секунд. Используя ThreadPoolexeCutor, каждая задача работает в своем собственном потоке. Потоки перекрываются во время ожидания, поэтому общее время выполнения намного короче, чем выполнение задач один за другим. Это показывает, как потоки повышают производительность для рабочих нагрузок ввода/вывода.
Вывод будет тем, что требуется вашей системе для выполнения этой задачи.
Измерение времени выполнения для задач, связанных с процессором
Здесь функция выполняет тяжелую арифметику для моделирования задачи, связанной с процессором. Эти операции выигрывают от истинного параллелизма. Используя ProcessPoolexeCutor, каждая задача выполняется в отдельном процессе в своем собственном ядре, если доступно. Процессы обходят GIL Python, чтобы они могли выполнять Python Bytecode параллельно. Это уменьшает общее время выполнения и повышает эффективность для рабочих нагрузок с тяжелыми процессорами.
Вывод будет тем, что требуется вашей системе для выполнения этой задачи.
Общие ловушки и лучшие практики избегают тупиков в тренажере
Законный тупик происходит, когда два или более потоков ждут, пока друг друга выпустят ресурсы, что заставит всех прекратить прогрессировать. Подумайте о двух инструментах для механики, которые нуждаются в другой, и отказываются отпустить. Работа останавливается.
Вы можете избежать тупиков по:
- Никогда не блокируя нить на неопределенный срок
- Используя контекст для обеспечения автоматического соединения потоков
- Быть осторожным с общими ресурсами и защита их замками, если это необходимо
Обработка накладных расходов на память в многопроцестрой
Каждый процесс имеет свое собственное пространство памяти, поэтому данные не делятся непосредственно между процессами. Это разделение увеличивает накладные расходы на память, потому что большие структуры данных дублируются по между процессами и потребляют больше системной памяти.
Управлять памятью:
- Избегайте передачи больших структур данных между процессами, когда это возможно.
- Используйте такие инструменты, как многопроцессор. Manager или Careed Memory Constructs, если вам необходимо поделиться данными, чтобы уменьшить дублирование и использование памяти.
Отладка затруднений и многопроцессных проблем
Отладка параллелистики и параллелизма создает проблемы, потому что потоки и процессы работают независимо и часто одновременно. Такие проблемы, как условия гонки или скрытые ошибки, становятся все труднее обнаружить.
Вот несколько советов:
- Проблемы с нитью, такие как условия гонки, могут оказаться сложно воспроизводить и исправить. Используйте инструменты синхронизации, такие как Threading.Lock () для контроля доступа к общим ресурсам.
- Проблемы процесса могут не показывать стандартные трассировки в основной программе. Используйте многопроцессорную работу.get_logger () или добавьте журнал внутри подпроцессов для захвата ошибок.
- Для сложной отладки и анализа производительности используйте инструменты профилирования или структуры более высокого уровня, такие как Joblib или DASK, которые предлагают лучшие абстракции и диагностику.
Заключение
Понимание различий между параллелизмом, параллелизмом и асинхронными задачами помогает вам определить, какой подход требует вашей задачи. В Python, ThreadPoolexecutor и ProcessPoolexeCutor дают вам простые способы эффективного обработки потоков и многопроцестрой для выполнения ввода/вывода и процессоров. Знание того, когда использовать каждый, может сэкономить время, уменьшить сложность и повысить производительность.
Trending Stories youtube.com/thenewstack Tech движется быстро, не пропустите эпизод. Подпишитесь на наш канал YouTube, чтобы транслировать все наши подкасты, интервью, демонстрации и многое другое. Группа подпишитесь с эскизом. Джессика Вахтел — писатель по маркетингу разработчиков в InfluxData, где она создает контент, который помогает сделать данные о мире временных рядов более понятными и доступными. Джессика имеет опыт работы в разработке программного обеспечения и технической журналистике. Подробнее от Джессики Вахтел