Асинхронные функции и цикл событий узла

Опубликовано: 7 Августа, 2021

Асинхронные функции

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

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

Но в Node все по-другому. При запуске приложения Node он создает только один поток выполнения. Когда узел получает запрос, он назначает поток этому процессу, и никакой другой запрос не может быть обработан, пока он не завершит обработку кода для текущего запроса. Следовательно, Node обрабатывает несколько запросов одновременно, используя функции цикла обработки событий и обратного вызова. Цикл событий - это тип функциональности, которая в основном опрашивает определенные события и при необходимости вызывает обработчики событий. Функция обратного вызова - это обработчик событий в Node.

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

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

Обслуживание параллельных запросов в приложении Node зависит от того, насколько загружено приложение и как оно спроектировано?

Примеры:




// Normal Function
function add(a,b){
return a+b;
}
// Async Function
async function asyncadd(a,b){
Return a+b;
}

Асинхронное открытие и запись содержимого файла




// load http module
var http = require( 'http' );
var fs = require( 'fs' );
// load http module
var http = require( 'http' );
var fs = require( 'fs' );
// create http server
http.createServer( function (req, res) {
// open and read in helloworld.js
fs.readFile( 'helloworld.js' , 'utf8' , function (err, data) {
res.writeHead(200, { 'Content-Type' : 'text/plain' });
if (err)
res.write( 'Could not find or open file for reading ' );
else
// if no error, writing JS file to a client
res.write(data);
res.end();
});
}).listen(8124, function () { console.log( 'bound to port 8124' );});
console.log( 'Server running on 8124/' );