node js 进阶-node的多核实现
来源:互联网 发布:linux 源码 mysql 编辑:程序博客网 时间:2024/06/06 02:53
从node 出现到现在,一直被我们熟知的是它的单线程模型,所有的任务都在一个线程中完成,从而免去了频繁切换线程的开销,以及减少资源互抢的问题。但是当我们的程序是CPU 密集型模型的时候node js 就显得不再有那么多优势,尽管node js 拥有异步机制,可以把一些耗时算法等待下个事件再实现,但是node js毕竟使用的是单线程模型,所以终究会出现阻塞,那node js 是如何处理高并发的呢?不会是不支持多线程吧?
而且虽然node js 是单线程异步非阻塞的,那是不是我们就可以高枕无忧了?举个栗子,当我们买完套餐(未领取)接着去买饮料的时候,已经叫我的号让我去取餐,但是我等了好久才拿到饮料,所以最终我会在套餐号被叫了很久之后我才去拿套餐,这就是我们特别担心的单线程的阻塞情况。
先来看一个示例代码:
<span style="font-family:KaiTi_GB2312;font-size:18px;">var start = Date.now();//获取当前时间戳setTimeout(function () { console.log(Date.now() - start); for (var i = 0; i < 1000000000; i++){//执行长循环 }}, 1000);setTimeout(function () { console.log(Date.now() - start);}, 2000);</span>上述程序执行出的结果:
<span style="font-family:KaiTi_GB2312;font-size:18px;">10003738</span>对于我们期望2秒之后执行的setTimeOut函数其实是经过了3738 毫秒之后才执行,因为执行了一个时间很长的for循环,所以我们整个node js 主线程被阻塞了,如果我们处理1000个用户请求,那么,因为其中第一个被阻塞,其余的999个请求都会被延迟执行,这样用户的体验度相当值得深思啊;虽然node 可以处理并发,但是我们依旧无法确保某一时刻不阻塞请求;
在Java,C#中都有对应的多线程编程,虽然有时候用起来会麻烦一些,但是在处理高并发的能力不得不感叹。所以如果node js 有创建子线程的能力,我们使用node 处理高并发请求的问题不就迎刃而解了?
cluster可以用来让node js 充分发挥多核CPU的性能:
<span style="font-family:KaiTi_GB2312;font-size:18px;">varcluster=require('cluster');varnumCPUs=8;functionfibo(n){ returnn>1?fibo(n-1)+fibo(n-2):1;} console.time('8cluster'); if(cluster.isMaster){//Forkworkers.for(vari=0;i<numCPUs;i++){ cluster.fork();}vari=8;cluster.on('exit',function(worker,code,signal){if(!--i){ console.timeEnd('8cluster'); process.exit(0); } });}else{ console.log(fibo(40)); process.exit(0);}</span>node js 的单线程给我们带来了莫大的遍历和乐趣,但使用单线程的过程中要警惕node 中异常捕获的疏忽导致整个node js 程序的崩溃,所以在使用过程中一定要小心的处理大量的循环,字符串拼接和浮点运算。可以适当地将部分操作分给子线程或者子进程来完成,但是要切记子线程和子进程的使用也是有开销的,要恰恰当使用;
1 0
- node js 进阶-node的多核实现
- node.js进阶学习
- node.js进阶学习
- Node.js进阶
- 让node.js充分利用多核服务器的性能
- Node.js的cluster模块用于使用多核CPU
- Node.js实现的BigPipe
- Node.js Stream - 进阶篇
- Node.js进阶のMongoDB
- Node.js进阶のMongoose
- Node.js--Mongoose使用进阶
- node.js中Socket.IO的进阶使用技巧
- node.js中Socket.IO的进阶使用技巧
- Node.js 实现简单的接口服务器
- node.js+express验证码的实现
- node.js的express实现jsonp
- 一个简单的node.js实现界面
- Node.js笔记 --了不起的Node.js
- 手动唤醒pmon的方法,手工唤醒pmon进程对释放killed状态的会话无效
- HDU 2089 不要62 (数位dp入门题)
- 全选,反选,全不选源代码
- Could not open Hibernate Session for transaction 解决方案
- 第八周拓展实践(3)换分币
- node js 进阶-node的多核实现
- Part 63 - mvc 分页
- 地图坐标转换 -- 火星坐标与GPS坐标
- android 使用shape 画虚线
- 排序
- 计算手续费
- Java学习之InputStream中read()与read(byte[] b)
- Spring IOC设计原理解析:本文乃学习整理参考而来
- 同步工具类--闭锁、信号量、栅栏的总结