Есть ли области где многопоточность лучше, чем асинхронность в python?
В python есть 3 способа выполнять код одновременно:
- многопроцессорность
- многопоточность
- асинхронность
Если с многопроцессорностью всё понятно - она позволяет реально распараллелить задачу, то насчет многопоточности и асинхронности возникают вопросы. По факту из-за GIL все потоки на самом деле работают в одном потоке (прямо как корутины!!). Они могут дать выигрышь в производительности только если в коде есть много неблокирующих операций (прямо как корутины!!!!). Исходя из этого факта, возникает резонный вопрос: "Зачем вообще использовать потоки, если есть asyncio с корутинами?". О реализациях python без GIL слышал, но интересует стандартный python 3 (И о будущей реализации python без GIL тоже слышал).
Ответы (1 шт):
Боюсь, что называть пакет asyncio "асинхронностью" не вполне корректно, поскольку и multiprocessing, и threading, и asyncio представляют собой три различных способа (возможности, метода) написания асинхронного кода. Подробнее здесь: https://youtu.be/0E50FVd5PGQ
Это с одной стороны. С другой стороны, само использование пекета asyncio отнюдь не гарантирует, что код в результате получится не синхронным, а асинхронным. Тут, как говорится, "всё дело в мастерстве мастера")))
Что же касается сути вопроса, то threading лучше asyncio, по крайней мере, в трёх случаях:
1.) Если в коде, который нужно сделать асинхронным, приходится использовать объект, не обладающий свойством awaitable (например пакет requests "не awaitable", поэтому в asyncio используется его "awaitable" вариант - пакет aiohttp);
2.) Использование asyncio подразумевает существенное изменение исходного кода (в отличии от threading). Поэтому, если нет желания или возможности изменять исходный код, то асинхронность даст только threading;
3.) Ну и, наконец, изучение asyncio требует чуть больше времени. Поэтому, если задачу надо решать срочно, а вы не знаете ни того, ни другого, то научиться работать с потоками будет несколько проще и быстрее.