Есть ли области где многопоточность лучше, чем асинхронность в python?

Рейтинг: 0Ответов: 1Опубликовано: 28.06.2023

В python есть 3 способа выполнять код одновременно:

  • многопроцессорность
  • многопоточность
  • асинхронность

Если с многопроцессорностью всё понятно - она позволяет реально распараллелить задачу, то насчет многопоточности и асинхронности возникают вопросы. По факту из-за GIL все потоки на самом деле работают в одном потоке (прямо как корутины!!). Они могут дать выигрышь в производительности только если в коде есть много неблокирующих операций (прямо как корутины!!!!). Исходя из этого факта, возникает резонный вопрос: "Зачем вообще использовать потоки, если есть asyncio с корутинами?". О реализациях python без GIL слышал, но интересует стандартный python 3 (И о будущей реализации python без GIL тоже слышал).

Ответы

▲ 2

Боюсь, что называть пакет asyncio "асинхронностью" не вполне корректно, поскольку и multiprocessing, и threading, и asyncio представляют собой три различных способа (возможности, метода) написания асинхронного кода. Подробнее здесь: https://youtu.be/0E50FVd5PGQ

Это с одной стороны. С другой стороны, само использование пекета asyncio отнюдь не гарантирует, что код в результате получится не синхронным, а асинхронным. Тут, как говорится, "всё дело в мастерстве мастера")))

Что же касается сути вопроса, то threading лучше asyncio, по крайней мере, в трёх случаях:

1.) Если в коде, который нужно сделать асинхронным, приходится использовать объект, не обладающий свойством awaitable (например пакет requests "не awaitable", поэтому в asyncio используется его "awaitable" вариант - пакет aiohttp);

2.) Использование asyncio подразумевает существенное изменение исходного кода (в отличии от threading). Поэтому, если нет желания или возможности изменять исходный код, то асинхронность даст только threading;

3.) Ну и, наконец, изучение asyncio требует чуть больше времени. Поэтому, если задачу надо решать срочно, а вы не знаете ни того, ни другого, то научиться работать с потоками будет несколько проще и быстрее.