Подтвердить что ты не робот

многопроцессорность против многопоточности против асинхронности в Python 3.4

Я обнаружил, что в Python 3.4 существует несколько разных библиотек для многопроцессорности/потоковой обработки: multiprocessing vs threading vs asyncio.

Но я не знаю, какой из них использовать или "рекомендуется". Они делают то же самое или разные? Если да, то какой из них используется для чего? Я хочу написать программу, которая использует мультикоры на моем компьютере. Но я не знаю, какую библиотеку я должен изучить.

4b9b3361

Ответ 1

Они предназначены для (слегка) разных целей и/или требований. CPython (типичная реализация Python на основной линии) по-прежнему имеет глобальный блокиратор интерпретатора, поэтому многопоточное приложение (стандартный способ реализации параллельной обработки в наши дни) является субоптимальным. Поэтому multiprocessing может быть предпочтительнее threading. Но не каждая проблема может быть эффективно разделена на [почти независимые] части, поэтому может возникнуть необходимость в интенсивной межпроцессной коммуникации. Поэтому multiprocessing не может быть предпочтительнее threading в целом.

asyncio (этот метод доступен не только для Python, но и для других языков и/или фреймворков, например Boost.ASIO) представляет собой метод эффективного управления множеством операций ввода-вывода из многих одновременных источников без необходимости параллельного выполнения кода. Это просто решение (действительно, действительно!) Для конкретной задачи, а не для параллельной обработки в целом.

Ответ 2

[Быстрый ответ]

TL; DR


Делать правильный выбор:

Мы прошли через самые популярные формы параллелизма. Но остается вопрос - когда выбирать, какой? Это действительно зависит от вариантов использования. Исходя из своего опыта (и чтения), я склонен следовать этому псевдокоду:

if io_bound:
    if io_very_slow:
        print("Use Asyncio")
    else:
        print("Use Threads")
else:
    print("Multi Processing")
  • CPU Bound => Мультиобработка
  • Связанный ввод/вывод, быстрый ввод/вывод, ограниченное количество соединений => многопоточность
  • Связанный ввод/вывод, медленный ввод/вывод, много соединений => Asyncio

Ссылка


[ ПРИМЕЧАНИЕ ]:

  • Если у вас есть метод длительного вызова (т. asyncio Метод, содержащий время asyncio), лучшим выбором будет asyncio, twisted или tornado подход (сопрограммные методы), который работает с одним потоком как параллелизм.
  • asyncio работает на Python3.4 и выше.
  • uvloop - это сверхбыстрая asyncio событий asyncio (uvloop asyncio asyncio в asyncio раза.).