加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

深入理解Node.js 进程与线程(8000字长文彻底搞懂)

发布时间:2019-08-20 03:46:39 所属栏目:建站 来源:koala
导读:前言 进程与线程是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有真的理解,在实际开发中应用也比较少。本篇文章除了介绍概念,通过Node.js 的角度讲解进程与线程,并且讲解一些在项目中的实战的应用,让

master.js 主要处理以下逻辑:

  • 创建一个 server 并监听 3000 端口。
  • 根据系统 cpus 开启多个子进程
  • 通过子进程对象的 send 方法发送消息到子进程进行通信
  • 在主进程中监听了子进程的变化,如果是自杀信号重新启动一个工作进程。
  • 主进程在监听到退出消息的时候,先退出子进程在退出主进程
  1. // master.js 
  2. const fork = require('child_process').fork; 
  3. const cpus = require('os').cpus(); 
  4.  
  5. const server = require('net').createServer(); 
  6. server.listen(3000); 
  7. process.title = 'node-master' 
  8.  
  9. const workers = {}; 
  10. const createWorker = () => { 
  11.     const worker = fork('worker.js') 
  12.     worker.on('message', function (message) { 
  13.         if (message.act === 'suicide') { 
  14.             createWorker(); 
  15.         } 
  16.     }) 
  17.     worker.on('exit', function(code, signal) { 
  18.         console.log('worker process exited, code: %s signal: %s', code, signal); 
  19.         delete workers[worker.pid]; 
  20.     }); 
  21.     worker.send('server', server); 
  22.     workers[worker.pid] = worker; 
  23.     console.log('worker process created, pid: %s ppid: %s', worker.pid, process.pid); 
  24.  
  25. for (let i=0; i<cpus.length; i++) { 
  26.     createWorker(); 
  27.  
  28. process.once('SIGINT', close.bind(this, 'SIGINT')); // kill(2) Ctrl-C 
  29. process.once('SIGQUIT', close.bind(this, 'SIGQUIT')); // kill(3) Ctrl- 
  30. process.once('SIGTERM', close.bind(this, 'SIGTERM')); // kill(15) default 
  31. process.once('exit', close.bind(this)); 
  32.  
  33. function close (code) { 
  34.     console.log('进程退出!', code); 
  35.  
  36.     if (code !== 0) { 
  37.         for (let pid in workers) { 
  38.             console.log('master process exited, kill worker pid: ', pid); 
  39.             workers[pid].kill('SIGINT'); 
  40.         } 
  41.     } 
  42.  
  43.     process.exit(0); 

工作进程

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读