nodejs 是单线程且支持高并发的脚本语言( node 异步 I/O )

node 的优点:I/O 密集型处理是 node 的强项,因为 node 的 I/O 请求都是异步的( sql 查询请求、文件流操作操作请求、http请求... )

 

异步

发出操作指令,然后就可以去做别的事情了(主线程无需等待),所有操作完成后执行回调



let a = 1; // step1:定义变量

// step2:发出指令,然后把回调函数加入事件队列(回调函数并没有执行)
setTimeout(() => {
    console.log(a);
}, 0)

a = 2; // step3:赋值,回调函数没有执行

// step4:发出指令,然后把回调函数加入异步队列(回调函数并没有执行)
setTimeout(() => {
    console.log(a);
}, 0)

a = 3; // step5:赋值,回调函数没有执行

// 当所有代码执行完毕,cpu空闲下来了,就会开始遍历执行事件队列里面的回调函数
// 最后输出:3 3



 

异步 I/O 的 node 为什么可以支持高并发?

I/O 操作由 node 的工作线程执行( nodejs 底层的 libuv 是多线程的线程池用来并行 io 操作)

主线程不需要等待结果返回,发出指令后就去执行其他事务

 

nodejs 在执行 JavaScript 时,内存受到 v8 限制,64位 约为 1.4g,32位 0.7g

所有 js 对象是通过堆分配,查看 process.memoryUsage ()

I/O 操作开启了多线程,但是所有线程都是基于 node 服务进程开启的,并不能充分利用 cpu 资源

限制内存原因:垃圾回收机制执行时,js 线程会暂停执行(避免 JS 应用逻辑与垃圾回收器看到的不一样),大量的堆内存回收严重影响性能

解决方法:pm2 是一个带有负载均衡(分摊到多个操作单元上进行执行)功能的 Node 应用的进程管理器

 

cpu核数与线程之间的关系

在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。而现在多核CPU的情况下,同一时间点可以执行多个任务,具体到这个任务在CPU哪个核上运行跟操作系统和CPU本身的设计相关

 

node的缺点:不擅长cpu密集型的操作

 



// 什么是cpu密集型操作(复杂的运算、图片的操作)
// 示例
for (let i = 0; i < 100000000; i++) {
    console.log(i);
}



nodejs是单线程的,进行密集型的运算会导致主线程挂起