0

Подскажите когда использовать threads, multiprocessing и asyncio? В каких задачах?

задан 30 июл. 2020 в 10:38
5
  • нужна параллельность и для задач cpu-bound = multiprocessing, для io-bound = threads, а asyncio дает async/await синтаксис, который делает асинхронный код похожим на синхронный, что проще кодировать. Commented 30 июл. 2020 в 11:00
  • что проще кодировать - ну не сказал бы) Commented 30 июл. 2020 в 11:03
  • @eri проще. намного проще. В питоне async/await не ахти конечно, но когда переводишь синхронный код в асинхронный, то часто хватает пройти и проставить await в нужных местах и все. Без async/await пришлось бы городить приличный огород с Threads и конечный код сильно бы отличался от оригинала и куда сложнее воспринимался бы Commented 30 июл. 2020 в 11:11
  • В питоне нет await внутри синхронной функции - начинается безумное дописывание async везде, но async нельзя дописать в асинхронных серверах - начинается еншуре футуре. хочется выполнить и продолжить сразу, но ран антил комплит уже не пашет - приходится в колбек передавать функцию замыкание, а если там ещё что-то асинхронное - получай колбэк хелл. конечно оборачивание ответа полностью в футуре работает, но потом нужно представлять где лок, где переключится контекст, что можно перенести в тред... ньюансов массы - код заставляет думать. я бы не сказал что он прощё Commented 30 июл. 2020 в 11:22
  • @eri мои слова "дописал await" как бы подразумевают "дописал async". В остальном же "думать нужно всегда", но переписывание проходит легко, либо приходится решать недостатки asyncio (я же и говорю что реализация не ахти по сравнению с c# например). И все равно трудоемкость перехода куда меньше threads варианта, а результат куда более похож на оригинал. А если кому то тяжело - значит он не привык мыслить в async- стиле. Commented 30 июл. 2020 в 11:32

1 ответ 1

3

asyncio и threads используется для задач ввода ввывода. Сетевого, дискового, для общения с медленными программами. Когда нужно обрабатывать очень большое количество соединений лучше подходит асинкио. Треды удобней для взаимодействия с пользователем.

Разница тредов и асинкио в том что asyncio переключает функцию на слове await, а остальные асинхронные функции ставит в очередь, а треды запускаются сразу (кушает больше ресурсов) и их переключает gil в произвольном месте. Тоесть асинхронные функции выполняются по очереди - не параллельно. Асинкио позволяет выполнить другие задачи пока относительно медленное соединение передает данные, когда данные пришли - возвращается к их обработке.

Простой сервер:

принял-скачал-обработал-выгрузил-принял-скачал-обработал-выгрузил

Сервер на тредах:

принял-принял-скачалоба-обработал-обработал-выгрузилоба

Сервер на асинкио:

принял1 - пока качается 1 принял 2 и начал качать2-пока качается 2 обработал1 - пока выгружается 1 обрабатывается 2 - выгружается 2

multiprocessing используется для задачек, где грузится процессор сильнее чем ввод-вывод. Минусом мультипроцессинга является потребление ресурсов для запуска новых процессов и накладные расходы для передачи данных между процессами.

Для задачек где есть много соединений и обработка данных используй asyncio и processpoolexecutor.

ответ дан 30 июл. 2020 в 11:01
6
  • Подскажи, пожалуйста. Правильно я понял: функция , которая объявляется с async без ключевого слова await не делает ничего полезного? А именно ключевое слово await говорит что-то типо - вот тут будет ввод/вывод , я пошёл делать , а вы там дальше работаете . Когда get_event_loop видит , что ввод/вывод закончился , функция работает дальше. ? Commented 30 июл. 2020 в 15:48
  • Asyncio это такие же треды, но с возможностью явно говорить , что эту часть запускать параллельно? А именно , я могу в await поставить любые вычисления и они будут выполняться на фоне , как поток , пока выполняется остальная часть программы ? Commented 30 июл. 2020 в 16:08
  • @BADITP1 асинкио это один тред с прерыванием и переключением на обработку нового коннетка пока идет ввод-вывод на старом Commented 30 июл. 2020 в 17:11
  • @BADITP1 да, аваит говорит что можно поделать чтото ещё из конкурентных задач пока ждём ввод-вывод для асинк функции Commented 30 июл. 2020 в 17:13
  • @BADITP1 асинкио это не параллельное выполнение, а разбивка на мелкие последовательные операции. Вводвывод там внутри сделан на асинхронных вызовах - проверяется доступность данных через вызов select, epoll и тп. Пока данных нет выполняется конкурентные функции Commented 30 июл. 2020 в 17:22

Ваш ответ

Черновик сохранён
Черновик удалён

Зарегистрируйтесь или войдите

Регистрация через Google
Регистрация через почту

Отправить без регистрации

Необходима, но никому не показывается

Отправить без регистрации

Необходима, но никому не показывается

Нажимая «Отправить ответ», вы соглашаетесь с условиями пользования и подтверждаете, что прочитали политику конфиденциальности.

Начните задавать вопросы и получать на них ответы

Найдите ответ на свой вопрос, задав его.

Задать вопрос

Изучите связанные вопросы

Посмотрите похожие вопросы с этими метками.