今天的内容涉及nodejs进程和react hooks
- Node.js开启服务进程例子1234567const http = require('http');const server = http.createServer();server.listen(3000,()=>{process.title='程序员成长指北测试进程';console.log('进程id',process.pid)})
一个线程只能隶属于一个进程,但是一个进程是可以拥有多个线程的。
- 下面演示一个开启子进程进行运算的例子1234567891011121314151617181920212223242526const http = require('http');const fork = require('child_process').fork;const server = http.createServer((req, res) => {if(req.url == '/compute'){const compute = fork('./fork_compute.js');compute.send('开启一个新的子进程');// 当一个子进程使用 process.send() 发送消息时会触发 'message' 事件compute.on('message', sum => {res.end(`Sum is ${sum}`);compute.kill();});// 子进程监听到一些错误消息退出compute.on('close', (code, signal) => {console.log(`收到close事件,子进程收到信号 ${signal} 而终止,退出码 ${code}`);compute.kill();})}else{res.end(`ok`);}});server.listen(3000, 127.0.0.1, () => {console.log(`server started at http://${127.0.0.1}:${3000}`);});
利用fork开启了一个子进程
- 看看子进程的文件123456789101112131415161718192021const computation = () => {let sum = 0;console.info('计算开始');console.time('计算耗时');for (let i = 0; i < 1e10; i++) {sum += i};console.info('计算结束');console.timeEnd('计算耗时');return sum;};process.on('message', msg => {console.log(msg, 'process.pid', process.pid); // 子进程idconst sum = computation();// 如果Node.js进程是通过进程间通信产生的,那么,process.send()方法可以用来给父进程发送消息process.send(sum);})
nodejs虽然是单线程模型,但是其基于事件驱动,异步非阻塞的模式,可用于高并发场景,避免了线程创建和线程上下文切换所消耗的资源。
- cluster 开启子进程Demo12345678910111213141516171819202122const http = require('http');const numCPUs = require('os').cpus().length;const cluster = require('cluster');if(cluster.isMaster){console.log('Master proces id is',process.pid);// fork workersfor(let i= 0;i < numCPUs.length;i++){cluster.fork();}cluster.on('exit',function(worker,code,signal){console.log('worker process died,id',worker.process.pid)})}else{// Worker可以共享同一个TCP连接// 这里是一个http服务器http.createServer(function(req,res){process.title = '无法违法';res.writeHead(200);res.end('hello word');}).listen(8000);}
根据cpus的个数创建子进程
- 下面演示创建一个线程守护12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576const fork = require('child_process').fork;const cpus = require('os').cpus();const server = require('net').createServer();server.listen(3000);const createWorker = () => {const worker = fork('./worker.js');worker.on('message', msg => {if (msg == 'suicide') {createWorker();}})worker.on('exit', (code, signal) => {console.log('worker process exited, code: %s signal: %s', code, signal);delete workers[worker.pid];})worker.send('server', server);workers[worker.pid] = worker;console.log('worker process created, pid: %s ppid: %s', worker.pid, process.pid);}// 根据核数创建子进程for (let i=0; i<cpus.length; i++) {createWorker();}// 父进程关闭要结束workerprocess.once('exit', close.bind(this));function close (code) {console.log('进程退出!', code);if (code !== 0) {for (let pid in workers) {console.log('master process exited, kill worker pid: ', pid);workers[pid].kill('SIGINT');}}process.exit(0);}// woker.jsconst http = require('http');const server = http.createServer((req, res) => {res.writeHead(200, {'Content-Type': 'text/plan'});res.end('I am worker, pid: ' + process.pid + ', ppid: ' + process.ppid);throw new Error('worker process exception!'); // 测试异常进程退出、重启});let worker;process.title = 'node-worker'process.on('message', function (message, sendHandle) {if (message === 'server') {worker = sendHandle;// 3000端口连接worker.on('connection', function(socket) {server.emit('connection', socket);});}});process.on('uncaughtException', function (err) {console.log(err);process.send({act: 'suicide'});worker.close(function () {process.exit(1);})})
nodejs进程的就到这里
- typescript用法123456789101112131415161718191. 可选练let x = foo?.bar().f2. type Record<K extends string, T> = {[P in K]: T}type AnimakType = 'cat' | 'dog' | 'frog'interface AnimaDes {name: string,title: string}const animaMap: Record<AnimakType, AnimaDes> = {cat: {name: 'cat', title: 'ddd'},dog: {name: 'cat', title: 'ddd'},frog: {name: 'cat', title: 'ddd'},}