Я знаком с системами на основе событий в C++, а также с java. Я пытался изучить node.js и столкнулся с интересным поведением, и я надеялся, что кто-то сможет объяснить, что происходит под капотом.Если node.js однопоточный, то почему server.listen() возвращается?
У меня есть программа, которая выглядит как
var http = require("http");
function main(){
// Console will print the message
console.log('Server running at http://127.0.0.1:8080/');
var server = http.createServer(function (request, response) {
// Send the HTTP header
// HTTP Status: 200 : OK
// Content Type: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
// Send the response body as "Hello World"
response.end('Hello World\n');
});
server.listen(8080); //Why is this not blocking
console.log('Main completed');
//main loop here prevents other stuff from working
}
main();
В таких языках, как Java или C Я бы ожидать две вещи. Либо server.listen предоставляет цикл событий, который заставляет server.listen никогда не возвращаться. Или server.listen создает новый поток и запускает цикл событий в новом потоке, который сразу возвращается. Затем он вызовет console.log, а затем вернется и закроет программу.
Чтобы проверить это, я также добавил цикл занятости под консолью.log, который выглядит.
var http = require("http");
function main(){
// Console will print the message
console.log('Server running at http://127.0.0.1:8080/');
var server = http.createServer(function (request, response) {
// Send the HTTP header
// HTTP Status: 200 : OK
// Content Type: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
// Send the response body as "Hello World"
response.end('Hello World\n');
});
server.listen(8080); //Why is this not blocking
console.log('Main completed');
while(true){
console.log('hi');
}
}
main();
Server.listen сразу возвращается и затем застревает в замкнутом цикле, как ожидалось. Мой браузер не может подключиться к серверу, что ожидается.
Если я удалю цикл занятости и вернусь к исходному коду после console.log ('Main completed'); выполняется вместо выведенной программы, основной поток возвращается в цикл событий.
Как это работает. Почему основной поток возвращается обратно в код сервера после возврата основного потока?
Редактировать: Я думаю, что решено, что очередь событий не существует в основной функции, но где она? Что им это нужно? и когда основная функция запускается со ссылкой на нее?
Полезно: http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/ – jarmod
Я понимаю эту часть цикла событий. Мой вопрос касается того факта, что основной поток выходит и выглядит так, будто он перескакивает обратно в другую точку. – nbroeking
потому что server.listen это асинхронная функция. Было бы неплохо прочитать о LivUV и EventEmmiter –