node基本理念(事件、多线程、进程)
关于node的几点理解:
1、所谓的node单线程,是指node的event loop,也就是我们的业务脚本是跑在一个单线程中的,可以理解为主线程;
2、若存在IO操作,例如文件、网络,是单独在线程里执行,将各种事件发送给上述的业务线程;例如业务线程里起的httpserver,会接受request、文件读取完成等事件;
3、IO工作线程存在多个,具体多个取决于libuv的配置,通常为4个,在windows下打开node,可以看到进程所包含线程为7;
4、如果将node配置为集群,则存在多个node进程;这些进程被分为主进程,和工作进程;通常利用如下:
cluster.on('exit', function(worker, code, signal) { console.log('worker ' + worker.process.pid + ' died'); }); if (cluster.isMaster) { cluster.fork(); cluster.fork(); console.log('master pid:' + process.pid); } else { // Workers can share any TCP connection // In this case its a HTTP server http.createServer(function(req, res) { res.writeHead(200); res.end("hello world\n"); }).listen(8000); console.log('child pid:' + process.pid); }
主进程负责根据CPU的数量,fork子进程。子进程建立多个http服务器,由于cluster支持端口共享,因此不会出现端口冲突错误。
5、因此我理解,不管是工作进程还是主进程,都存在自己唯一的event loop;
6、express下扩展至cluster,修改如下(以enide建立的默认express工程为例):
var cluster = require( 'cluster' ); var cCPUs = require('os').cpus().length; console.log("cCPUS:", cCPUs); if( cluster.isMaster ) { // Create a worker for each CPU for( var i = 0; i < cCPUs; i++ ) { cluster.fork(); } cluster.on( 'online', function( worker ) { console.log( 'Worker ' + worker.process.pid + ' is online.' ); }); cluster.on( 'exit', function( worker, code, signal ) { console.log( 'worker ' + worker.process.pid + ' died.' ); }); } else { http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); }); }
此时如果并发访问时,会将http请求分发到不同的进程。这个架构原理和nginx是一样的,本质都是父子进程共享端口。
后面是关于node 异步在segmentfault的一个问题,备注如下:
http://segmentfault.com/q/1010000004399488
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2013-01-27 ucos-II 时间管理源码分析
2013-01-27 AsyncTask
2013-01-27 sqlite(2、事务)