node服务器需要重启才能执行改动后的代码,如果在生产环境中重启会造成用户几秒钟的无响应。针对这一问题,我们可以利用cluster模块来实现基于express框架的零秒热重载。 master进程开启一个监听重启命令的http服务器,监听重启命令后,fork一个新的工作进程,等新的工作进程创建完成时,kill原来老的工作进程,便实现了热重载。 该脚本可以配合supervisor一起使用,守护进程。
1. 概述
2. 原理
当我需要更新项目时,使用cmd命令即可curl http://localhost:3000/reload pause
supervisor -w startServer.js startServer.js
3. 源码
const cluster = require('cluster'); const child_process = require('child_process'); const http = require('http'); if (cluster.isMaster) { console.log(`主进程 ${process.pid} 正在运行`); // fork工作进程 forkWorkProcess(); createReloadServer(); cluster.on('exit', work => { console.log(`工作进程 ${work.process.pid} 已退出`); }); } else { // express框架的启动文件 require('./bin/www'); console.log(`工作进程 ${process.pid} 已启动`); } // 创建1个工作进程 function forkWorkProcess() { child_process.exec('nvm use 8.12 64', (e, stdout) => { console.log(stdout); setTimeout(() => { cluster.fork(); }, 2000); }); } // 创建监听重启命令的http服务器 function createReloadServer() { http.createServer((req, res) => { if (req.url === '/reload') { if (cluster.isMaster) { const arr = Object.keys(cluster.workers); if (arr.length !== 0) { forkWorkProcess(); setTimeout(() => { const arr = Object.keys(cluster.workers); process.kill(cluster.workers[arr[0]].process.pid); }, 20000); } } res.end('reloading'); } else { res.end('unknow command'); } }).listen(3000); } // 查看log setInterval(() => { if (cluster.isMaster) { const workerArr = Object.keys(cluster.workers); // 工作进程意外退出时,fork新的工作进程 if (workerArr.length === 0) { forkWorkProcess(); } console.log(new Date()); console.log(workerArr); } }, 10000);
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算