Цель как асинхронных методов, так и потоков — обеспечить возможность одновременной обработки нескольких задач.
Потоки подход выглядит простым и интуитивно понятным. Если программа на Python обрабатывает несколько задач одновременно, у нас есть поток (может быть с подпотоками) для каждой задачи, стек каждого потока отражает текущий этап обработки соответствующей задачи. Все просто, есть простые в использовании механизмы запуска нового потока и ожидания от него результатов.
Насколько я понимаю, единственная проблема такого подхода в том, что потоки дорогие.
Другой подход — использование асинхронных сопрограмм. Я вижу несколько неудобств в этом подходе. Я назову лишь пару из них. Теперь у нас есть два типа методов: обычные методы и асинхронные методы. В 90% случаев единственная разница заключается в том, что вам нужно помнить, что этот метод является асинхронным, и не забывать использовать ключевое слово await при вызове этого метода. И да, вы не можете вызвать метод async из обычных. И весь этот синтаксический мусор async - await по всей программе предназначен только для того, чтобы указать, что этот метод способен передать управление циклу сообщений.
Подход Threads свободен от всех этих неудобств. Но подход async - await позволяет обрабатывать гораздо больше параллельных задач, чем подход потоков. Как это возможно?
Для каждой параллельной задачи у нас по-прежнему есть стек вызовов, только теперь это стек вызовов сопрограмм. Я не совсем уверен, но похоже, что это ключевое отличие: обычные стеки — это стеки операционной системы, они дорогие, стеки сопрограмм — это просто структуры Python, они намного дешевле. Правильно ли я понимаю?
Если это правильно, не лучше ли было бы отделить потоки/стеки вызовов Python от потоков/стеков вызовов ОС, чтобы удешевить потоки Python?
Извините, если вопрос глупый. Я уверен, что есть несколько причин, по которым асинхронность-
Код: Выделить всё
await
Обновление:
Для тех, кто не считает этот вопрос плохим и слишком широко.
Вот статья Unyielding, которая начинается с объяснений, почему потоки плохи, и рекламирует асинхронный подход. Основной тезис: потоки — это зло, слишком сложно рассуждать о подпрограмме, которая может выполняться из произвольного числа потоков одновременно.
Спасибо Натаниэлю Дж. Смиту (автору библиотеки Python Trio). кто подсказал эту ссылку.
Кстати, доводы в статье для меня не убедительны, но все же могут быть полезны.
Позднее обновление
Только что нашел очень хороший пост в блоге о потоках и асинхронности в Python и других языках. Мудрость игровой площадки: потоки превосходят Async/Await.
Подробнее здесь: https://stackoverflow.com/questions/480 ... er-threads