Я обнаружил, что в Python 3.4 есть несколько разных библиотек для многопроцессорности / многопоточности: многопроцессорность vs многопоточность vs asyncio .
Но я не знаю, какой из них использовать, или какой из них «рекомендуется». Они делают то же самое или разные? Если да, то какой для чего? Я хочу написать программу, использующую многоядерность на моем компьютере. Но я не знаю, какую библиотеку мне следует изучить.
python
multithreading
python-3.x
multiprocessing
python-asyncio
user3654650
источник
источник
Ответы:
Они предназначены для (немного) иных целей и / или требований. CPython (типичная основная реализация Python) по-прежнему имеет глобальную блокировку интерпретатора, поэтому многопоточное приложение (стандартный способ реализации параллельной обработки в настоящее время) неоптимально. Вот почему
multiprocessing
может быть предпочтительнееthreading
. Но не каждую проблему можно эффективно разделить на [почти независимые] части, поэтому может возникнуть необходимость в интенсивном межпроцессном взаимодействии. Вот почемуmultiprocessing
не может быть предпочтительнееthreading
вообще.asyncio
(этот метод доступен не только в Python, он также есть в других языках и / или фреймворках, например, Boost.ASIO ) - это метод для эффективной обработки большого количества операций ввода-вывода из многих одновременных источников без необходимости параллельного выполнения кода. . Так что это просто решение (действительно хорошее!) Для конкретной задачи, а не для параллельной обработки в целом.источник
[Быстрый ответ]
TL; DR
Сделать правильный выбор:
if io_bound: if io_very_slow: print("Use Asyncio") else: print("Use Threads") else: print("Multi Processing")
Справка
[ ПРИМЕЧАНИЕ ]:
asyncio
цикл обработки событий ( uvloop делаетasyncio
2-4x быстрее).[ОБНОВЛЕНИЕ (2019)]:
источник
asyncio
когда используете из ожидаемых функций,request
библиотека не является ожидаемым методом, вместо этого вы можете использовать, например,aiohttp
библиотеку или асинхронный запрос и т. д.Это основная идея:
Поэтому в основном придерживайтесь потоковой передачи, если у вас нет проблем с вводом-выводом / процессором.
источник
В многопроцессорном режиме вы используете несколько процессоров для распределения вычислений. Поскольку каждый из процессоров работает параллельно, вы эффективно можете выполнять несколько задач одновременно. Вы хотели бы использовать многопроцессорность для задач, связанных с ЦП . Примером может быть попытка вычислить сумму всех элементов огромного списка. Если на вашем компьютере 8 ядер, вы можете «разрезать» список на 8 меньших списков и вычислить сумму каждого из этих списков отдельно для отдельного ядра, а затем просто сложить эти числа. Вы получите ~ 8-кратное ускорение, сделав это.
В (мульти) резьбывам не нужно несколько процессоров. Представьте себе программу, которая отправляет множество HTTP-запросов в Интернет. Если вы использовали однопоточную программу, она останавливала выполнение (блок) при каждом запросе, ожидала ответа, а затем продолжала после получения ответа. Проблема здесь в том, что ваш процессор на самом деле не работает, ожидая, пока какой-то внешний сервер выполнит эту работу; Тем временем он действительно мог бы проделать некоторую полезную работу! Исправление заключается в использовании потоков - вы можете создать множество из них, каждая из которых отвечает за запрос некоторого контента из Интернета. Хорошая вещь о потоках заключается в том, что даже если они работают на одном ЦП, ЦП время от времени «замораживает» выполнение одного потока и переходит к выполнению другого (это называется переключением контекста, и это происходит постоянно в недетерминированном режиме). интервалы). Итак, если ваша задача - использовать многопоточность.
asyncio, по сути, распределяет потоки, когда не процессор, а вы, как программист (или собственно ваше приложение), решаете, где и когда происходит переключение контекста . В Python вы используете
await
ключевое слово, чтобы приостановить выполнение вашей сопрограммы (определяется с помощьюasync
ключевого слова).источник