node.js多线程

  • Post author:
  • Post category:其他


用自己语言简单理解一下进程与线程。一台机器上可以同时运行多个程序,每个程序内可以开启多个进程,而每个进程内部又可以有多个线程(有些语言还可以在线程内部有多个纤程,但不具备代表性)。

多进程与多线程基本区别


多进程——重:有独立的存储空间


优点:安全(万一某一进程崩了,其他进程还在工作,不至于程序无法运行),简单


缺点:性能相对低点(开进程开销大)


多线程——轻:同一进程内的线程共享一块空间


优点:性能高点(开线程开销小),多个线程间通信容易


缺点:不安全(某一线程崩了影响整个进程),复杂(共享一块空间),多个线程通信太容易

node.js简单实现多进程

实际上来说,普通程序无法创建进程,只有系统可以。所以一般可以用主进程分裂(克隆)出一个子进程。node.js中可以用cluster模块实现多进程,cluster中fork()可以从主进程分裂出子进程。


注意:


只有主进程有fork(),所以在分裂出子进程时需要判断当前是否主进程。


出于安全性考虑,一般主进程只负责派生子进程,以保证程序不那么容易崩。


主进程与子进程能够共享句柄(所以同一体系内的主子进程能共享一个端口)

实现代码

const cluster = require('cluster');
const os = require('os');
const process = require('process');
const http = require('http');
const url = require('url');
const fs = require('fs');
const zlib = require('zlib');

//如果当前是主进程,则主负责克隆出子进程
if(cluster.isMaster){
    for(let i=0; i<os.cpus().length; i++){        
        //克隆子进程
        cluster.fork();
    }
    console.log('主进程');
}else{
    http.createServer((req, res) => {
        let {pathname} = url.parse(req.url);
        //当前工作进程
        console.log(`由${process.pid}进程处理的`);

        let rs = fs.createReadStream(`.${pathname}`);
        let gz = zlib.createGzip();
        res.setHeader('Content-Encoding', 'gzip');
        rs.pipe(gz).pipe(res);

        rs.on('error', () => {
            res.setHeader('Content-Encoding', 'plain');
            res.writeHead(404);
            res.end('NOT FOUND');
        })
    }).listen(8888, () => {
        console.log('server listening at port 8888');
    })
}

控制台打印



版权声明:本文为samfung09原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。