многопроцессорность против многопоточности против асинхронности в Python 3.4
Я обнаружил, что в Python 3.4 существует несколько разных библиотек для многопроцессорности/потоковой обработки: multiprocessing vs threading vs asyncio.
Но я не знаю, какой из них использовать или "рекомендуется". Они делают то же самое или разные? Если да, то какой из них используется для чего? Я хочу написать программу, которая использует мультикоры на моем компьютере. Но я не знаю, какую библиотеку я должен изучить.
Ответы
Ответ 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
раза.).