Разница между многопроцессорностью, asyncio и concurrency.futures в python - PullRequest
3 голосов
/ 21 апреля 2020

Будучи новичком в использовании параллелизма, я не понимаю, когда использовать разные библиотеки python параллелизма. Насколько я понимаю, многопроцессорность, многопоточность и асинхронное программирование являются частью параллелизма, в то время как многопроцессорность является частью подмножества параллелизма, называемого параллелизмом.

Я искал в Интернете различные способы приблизиться к параллелизму в python, и я натолкнулся на многопроцессорную библиотеку, ProcessPoolExecutor () и ThreadPoolExecutor (), а также asyncio из concurrenct.futures. Что меня смущает, так это разница между этими библиотеками. Особенно то, что делает многопроцессорная библиотека, так как она имеет такие методы, как pool.apply_asyn c, выполняет ли она также работу asyncio? Если это так, то почему он называется многопроцессорным, если это другой метод для достижения параллелизма от asyncio (множественные процессы против совместной многозадачности)?

1 Ответ

3 голосов
/ 22 апреля 2020

Существует несколько разных библиотек:

  • threading: интерфейс с потоками уровня ОС. Обратите внимание, что работа с процессором в основном сериализуется GIL , поэтому не ожидайте ускорения в своих вычислениях. Используйте его, когда вам нужно параллельно вызывать API-интерфейсы блокировки, в частности, когда вам нужен контроль над созданием потоков. Избегайте создания слишком большого количества потоков, поскольку они дорогие.

  • multiprocessing: интерфейс для порождения нескольких процессов python с API, преднамеренно подобным threading. Несколько процессов работают параллельно, поэтому вы можете ускорить вычисления, используя этот метод. Недостатком является то, что вы не можете совместно использовать структуры данных в памяти без использования мультипроцессорных спецификаций c tools .

  • concurrent.futures: современный интерфейс для либо многопоточность, либо многопроцессорность, которая обеспечивает удобные пулы потоков / процессов, которые она называет исполнителями. Основной точкой входа в пул является метод submit, который возвращает маркер , который можно проверить на завершение или дождаться его результата. Получение результата дает возвращаемое значение переданной функции и правильно распространяет возбужденные исключения (если есть), что утомительно делать с threading. Это должен быть первый инструмент выбора при рассмотрении параллелизма на основе потоков или процессов.

  • asyncio: в то время как предыдущие параметры "asyn c" в ощущение, что они предоставляют неблокирующие API (это то, что имеют в виду apply_async и друзья), они все еще полагаются на пулы потоков / процессов, чтобы делать свои волхвы c, и не могут реально делать больше вещей параллельно, чем у них есть работники в бассейне. Asyncio использует один поток выполнения и системные вызовы asyn c по всем направлениям. У него вообще нет блокирующих вызовов, единственной блокирующей частью является точка входа asyncio.run(). Код Asyncio обычно пишется с использованием сопрограмм, которые используют await для приостановки, пока не произойдет что-то интересное. (Приостановка отличается от блокирования тем, что позволяет потоку события l oop продолжать другие вещи, пока вы ожидаете.) У него много преимуществ по сравнению с решениями на основе потоков, такими как возможность создавать тысячи дешевых " «Задачи», не перегружая систему и не имея возможности отменять задачи или легко ждать нескольких вещей одновременно. Asyncio должен быть предпочтительным инструментом для серверов и для клиентов, подключающихся к нескольким серверам.

При выборе между asyncio и многопоточностью / многопроцессорностью учитывайте пословицу «многопоточность» для параллельной работы, а asyn c для параллельного ожидания ".

Также обратите внимание, что asyncio может ожидать функции выполненные в пулах потоков или процессов, предоставляемых concurrent.futures, поэтому это может служить связующим звеном между всеми этими различными моделями. Это одна из причин, почему asyncio часто используется для создания новой библиотечной инфраструктуры.

...