node.js - NodeJs中阻塞的疑问
高洛峰
高洛峰 2017-04-17 11:58:59
[Node.js讨论组]
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的回调,所以当我在里面主动阻塞,会对下一个阻塞请求有影响,这样理解对么?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(2)
伊谢尔伦

这个回调函数的意思是:有任何发到 8080 的请求,都会执行这个回调函数。

所以,当第一个请求过来,res.end() 正常执行,请求得到正确的响应。此后,回调函数还没有执行完成,while(i) 这个语句阻塞了 v8 引擎唯一的进程和线程,不能再执行任何其它的代码。之后所有的请求,也无法被处理,更得不到响应。

你的理解,基本是正确的。

巴扎黑

NODE 这样设计感觉纯粹是为了装B。
线程切换的开销真有那么大嘛?大量的高性能计算程序有几个不用c++(多线程)的。

对于流程线条简单的,你包装一个回调函数来实现倒没什么,一个复杂的怎么办?
比如一个事务需要n次数据库查表操作,且这些查表操作之间是有依赖的(B步查询操作要使用A步查询的结果),怎么办?那些所谓并行插件都是对非相关性多事务的,有相关性的根本处理不了,只能搞回调函数堆叠,代码结构丑死了。
ES几个版本中这个问题上倒腾来倒腾去,各种模拟扩展来实现这种复杂业务。。。你弄多线程不是说了。

感觉是削足适履的设计,本来CPU发展方向就是多核超线程,你个node还要限制单线程,有病嘛不是。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号