Что такое асинхронность в программировании?
Не понимаю, почему подход называется асинхронным, если по сути, выполнение этих функций просто переносится в конец синхронной очереди (event loop). Тоже самое, если их просто вызвать последними? Я думал, что это когда параллельно выполняются задачи в одном потоке.
Ответы (1 шт):
Стоит объяснить на примере. В одном из обработчиков мы отправили запрос к БД. БД его обрабатывает 5 секунд.
app.get('/syncRequestForTest', function(req, res){ // сервер может принять и обработать один запрос в 5 секунд.
let user = yourDB.users.findSync({_id: req.data.id}) // у нас очень много данных БД, поэтому БД обрабатывает такой запрос 5 секунд.
req.send(user)
}
app.get('/other', function(req, res){ // сервер не может обработать этот запрос, пока он занят синхронными вычислениями.
...
}
В данном примере программа будет ждать синхронный запрос 5 секунд, пока БД вернет ответ. Эти 5 секунд она не может обрабатывать другие запросы, что недопустимо в продакшене.
Если же запрос будет выполняться асинхронно, то во время ожидания ответа от БД сервер сможет обрабатывать другие запросы:
app.get('/asyncRequestForTest', async function(req, res){ // сервер может принимать сотни таких запросов в секунду.
let user = await yourDB.users.findAsync({_id: req.data.id}) // у нас очень много данных БД, поэтому БД обрабатывает такой запрос 5 секунд.
req.send(user)
}
app.get('/other', function(req, res){ // сервер может обработать этот запрос, пока где-то снаружи основного потока приложения выполняются асинхронные задачи.
...
}
Обычно асинхронный подход используется для запросов к сторонним программам (fetch-запрос в браузере, чтение и запись файлов, запросы к БД). Потому что эти запросы обычно длятся сравнительно долго и при этом не загружают ресурсы (все что делает приложение - ждет), а приостанавливать работу всего приложения (например, сервера), пока читается файл для обработки одного из запросов, недопустимо.
Вот эта статья на английском с картинками описывает разницу между синхронным, асинхронным выполнением, а также касается многопоточности.
Вот статья на Хабре с объяснением разницы между этими подходами.
Вот вопрос на русском StackOverflow, где много хороших примеров по разнице между многопоточностью, асинхронностью, синхронностью и конкуррентностью.
Продублирую здесь ответ:
Многопоточное программирование подразумевает, что код приложения выполняется в разных потоках. Например, есть главный поток UI, и несколько рабочих потоков, которые выполняют тяжелые вычисления, результаты которых затем выводятся на UI.
Асинхронное программирование подразумевает инициацию некоторой операцию, об окончании которой главный поток узнает спустя некоторое время. Обычно это применяется для работы с системой ввода-вывода: диски, сеть и т.д. При этом, если это все сделано правильно, никакого потока нет. Также часто под выражением "выполнить асинхронно" подразумевают, что выполнение некоторого кода будет произведено не в текущем потоке, а в соседнем, при этом текущий поток не будет заблокирован. Но мой взгляд, это не совсем корректно.
Параллельное программирование подразумевает разбиение одной задачи на независимые подзадачи, которые можно рассчитать параллельно, а затем объединить результаты. Один из примеров -- это map-reduce. Это частный случай многопоточного программирования.