Асинхронные функции и цикл событий узла
Асинхронные функции
Все знают, что 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/' ); |