@wpbloger

Область применения асинхронного программирования?

Здравствуйте.
Затронул для себя эту довольно популярную для веба тему как асинхронное программирование, в интернете есть много статей на эту тему так что разобраться не так сложно, но у меня остались ряд вопросов которые хотелось бы прояснить.

Как я понял асинхронное программирование это не панацея а в некоторых случаях оно приводит к потери производительности, как пример упоминают сложные мат вычисления которые могут заблокировать поток выполнения который пробегает по событиям.

Правильно ли я понимаю что при этом загрузка и чтение файлов допустим как и тяжелые запросы к бд не приведут к этому а наоборот при асинхронном выполнении дадут прирост общей производительности, так как процессорное время будет занято другими вещами, в данном случае будет происходить лишь ожидание чтения/записи, чего не скажешь при мат вычеслениях где не посредственно используется процессорное время для вычислений.
Правильно ли я понял разницу?

И если я понял правильно, то для типичных веб сайтов на которых в основном происходит чтение и запись в бд и отдача после результатов запросов отображения, ну и загрузка файлов на сервер тоже распространеный случий, более производительным окажется вариант с асинхронным исполнением так как в этом случае процессорное время не будет тратится на ожидание так?
  • Вопрос задан
  • 1001 просмотр
Решения вопроса 1
@lega
Асинхронный код позволяет выполнять код параллельно в одном потоке, итого профит в том что экономится память т.к. каждый поток требует память под себя. По сути все.
Итого это позволяет запускать 1Млн параллельных задач и более, экономя память.

Код не работает быстрее, а зачастую медленнее, т.к. ваша реализация переключения задач медленнее чем это делает ОС и процессор.
Выигрыш может быть за счет того что вы запустите задачи параллельно, когда в много поточном вы будете их блокировать друг другом. Но если под каждую задачу делать отдельный поток, то асинхронный не будет быстрее.

Асинхронный подход имеет смысл (только) когда в задаче есть долгие блокировки (веб-сокеты, сетевые закачки с зависаниями) - когда поток весит и ждет события, тогда вместо 10к потоков, можно все задачу уложить в один асинхронный поток.

Все бы нечего, но проблема в том что сложность асинхронного кода гораздо выше в разных аспектах, итого времени может тратится в разы больше (год на проект вместо 4 мес например).

Поэтому асинхронность применять лучше там где это оправдано (для веб-сокетов), а весь остальной проект делать "классически". А сейчас из-за моды некоторые пытаются целиком все асинхронным кодом делать, потом иногда по прошествии года/двух появляются статьи о том что асинхронность не стоит того, а их в комментариях обливают, что мол не умеете готовить.

Более разумным видится использование файберов/корутин, но эту тему не сильно развивают.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Грубо говоря - профит в ситуациях, в которых процесс простаивает во время выполнения операции (например, указанные в вопросе ситуации).

Соответственно, если работа происходит синхронно - в это время невозможна работа с другими запросами. Если юзаются "системные" потоки - уже лучше, но накладные расходы относительно высоки. Ну и существуют подходы, позволяющие лучше утилизировать 1 поток (нодовое event-driven, golang-е горутины и прочее).
Ответ написан
Комментировать
Rou1997
@Rou1997
На серверной стороне если протокол HTTP и сервер Apache/nginx, то асинхронность и многозадачность используется абсолютно всегда, на клиентской это AJAX и т.п., AJAX оптимизирует и клиентскую и серверную сторону, если только сервер не будет опрашиваться слишком часто.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы