var http=require('http');
var i=0;
http.createServer(function(req,res){
console.log(++i+" requrest accept!");
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello word');
while(1);
}).listen(8080);
上面的代码中,我使用while(1);阻塞了createServer的回调。在我的理解中,是由于NodeJs是单线程的,所以调用createServer创建一个侦听之后,之后的请求都会给createServer的回调,所以当我在里面主动阻塞,会对下一个阻塞请求有影响,这样理解对么?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
这个回调函数的意思是:有任何发到
8080的请求,都会执行这个回调函数。所以,当第一个请求过来,
res.end()正常执行,请求得到正确的响应。此后,回调函数还没有执行完成,while(i)这个语句阻塞了 v8 引擎唯一的进程和线程,不能再执行任何其它的代码。之后所有的请求,也无法被处理,更得不到响应。你的理解,基本是正确的。
NODE 这样设计感觉纯粹是为了装B。
线程切换的开销真有那么大嘛?大量的高性能计算程序有几个不用c++(多线程)的。
对于流程线条简单的,你包装一个回调函数来实现倒没什么,一个复杂的怎么办?
比如一个事务需要n次数据库查表操作,且这些查表操作之间是有依赖的(B步查询操作要使用A步查询的结果),怎么办?那些所谓并行插件都是对非相关性多事务的,有相关性的根本处理不了,只能搞回调函数堆叠,代码结构丑死了。
ES几个版本中这个问题上倒腾来倒腾去,各种模拟扩展来实现这种复杂业务。。。你弄多线程不是说了。
感觉是削足适履的设计,本来CPU发展方向就是多核超线程,你个node还要限制单线程,有病嘛不是。