node 是单线程的, 采用单线程异步非阻塞模式. 因为 JavaScript 引擎的关系, node 默认是单线程, 一个 node.JS 应用无法利用多核资源. 那么 Node.JS 怎么实现多线程? 下面给大家介绍一下, 希望对大家有所帮助.
Node 可以在不新增额外线程的情况下, 依然可以对任务进行并发处理, 通过事件循环 (event loop) 来实现并发操作.
Threads à gogo 是 Node.JS 的原生模块, 使用这个模块可以让 Node.JS 具备多线程处理功能.
安装方法
NPM install threads_a_gogo
下载测试源码
Git clone http://github.com/xk/node-threads-a-gogo.git
导入模块代码
- var tagg= require('threads_a_gogo');
- API
- tagg= require('threads_a_gogo') // 生成 tagg object
- var thread = tagg.create( /* no arguments */ ) // 生成 thread object
- var thread_pool = tagg.createPool( numberOfThreads ) // 生成 thread pool
- thread.load("boot.js").eval("boot()").emit("go").on("event", cb)
- //thread 读取 boot.JS 文件 执行 boot(), 发送 event go, 并且监听 event 事件 cb(err,result)
- thread_pool.load('path') //pool 中的任意(.all 为全部)thread 读取 path file
- pool.any.eval( program, cb ) //pool 中的任意(.all 为全部)thread 执行 program
为什么要用多线程?
1. 平行执行, 无需排队, 快速.
2. 公平性, 所有线程统一优先级.
3. 完整利用资源, 让更多的 CPU 参与 task 的处理.
4. 所有线程共用一个储存地址.
实例
我们先来做一个简单的测试, 用斐波那契数组来看一下, 加入了多线程的 node 有多么的强悍:(测试机器为 4CPU)没有使用 TAGG 的正常情况, 异步也帮不了我们应对 CPU 密集型任务
- function fibo (n) {
- return n> 1 ? fibo(n - 1) + fibo(n - 2) : 1;
- }
- var n=8
- function back(){
- if(!--n) return console.timeEnd('no thread');
- }
- console.time('no thread');
- process.nextTick(function(){
- console.log(fibo (40));
- back();
- })
- process.nextTick(function(){
- console.log(fibo (40));
- back();
- })
- process.nextTick(function(){
- console.log(fibo (40));
- back();
- })
- process.nextTick(function(){
- console.log(fibo (40));
- back();
- })
- process.nextTick(function(){
- console.log(fibo (40));
- back();
- })
- process.nextTick(function(){
- console.log(fibo (40));
- back();
- })
- process.nextTick(function(){
- console.log(fibo (40));
- back();
- })
- process.nextTick(function(){
- console.log(fibo (40));
- back();
- })
我们模拟了 8 个异步的行为, 测试用的 node v0.8.16 版本, 所以 process.nextTick 还是异步方法. 最后我们输出结果为:
- 165580141
- 165580141
- 165580141
- 165580141
- 165580141
- 165580141
- 165580141
- 165580141
- no thread: 23346ms
来源: http://www.css88.com/qa/node-js/12093.html