|
1.回顾进程和线程的定义进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。2.Node.js的单线程Node特点主线程是单线程的一个进程只开一个主线程,基于事件驱动的、异步非阻塞I/O,可以应用于高并发场景。Nodejs中没有多线程,为了充分利用多核cpu,可以使用子进程实现内核的负载均衡,那我们就要解决以下问题:Node.js做耗时的计算时候阻塞问题。Node.js如何开启多进程。开发过程中如何实现进程守护。3.场景实例const http = require('http');http.createServer((req,res)=>{ if(req.url === '/sum'){ // 求和 let sum = 0; for(let i = 0 ; i { if(req.url === '/sum'){ let childProcess = fork('calc.js',{ cwd:path.resolve(__dirname,'test') }); childProcess.on('message',function(data){ res.end(data+''); }) }else{ res.end('ok'); }}).listen(3000);4.3.execFile通过node指令,直接执行某个文件:let childProcess = execFile("node",['./test/sub_process'],function(err,stdout,stdin){ console.log(stdout); });内部调用的是 spawn方法。4.4.execlet childProcess = exec("node './test/sub_process'",function(err,stdout,stdin){ console.log(stdout)});内部调用的是execFile,其实以上三个方法都是基于spawn的。5.clusterNode.js的单个实例在单个线程中运行。为了利用多核系统,用户有时会希望启动Node.js进程集群来处理负载。自己通过进程来实现集群。子进程与父进程共享HTTP服务器fork实现:let http = require('http');let { fork} = require('child_process');let fs = require('fs');let net = require('net');let path = require('path');let child = fork(path.join(__dirname, '8.child.js'));let server = net.createServer();server.listen(8080, '127.0.0.1', function () { child.send('server', server); console.log('父进程中的服务器已经创建'); let httpServer = http.createServer(); httpServer.on('request', function (req, res) { if (req.url != '/favicon.ico') { let sum = 0; for (let i = 0; i { res.end(process.pid+'','pid'); }) .listen(3000); console.log("server start",process.pid);}紧追技术前沿,深挖专业领域扫码关注我们吧!
|
|