我熟悉C++和Java中的事件驱动系统。我正在尝试学习Node.js,并遇到了有趣的行为,我希望有人能解释一下底层发生了什么。
我的程序看起来像这样:
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,然后关闭程序并返回。
为了测试这个,我还添加了一个忙循环,在console.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');,而不是程序退出,主线程就会跳回事件循环中。
这是如何工作的?为什么主线程在返回后会跳回服务器代码?
编辑: 我认为我们解决了事件队列不在主函数中的问题,但它在哪里?谁拥有它?主函数何时参考它运行?