nodeJS同时运行多个子进程
2018-06-19 16:10
274 查看
在游戏项目开发中,经常会遇到有大厅内含多个子程序的模式,这时候使用nodeJs做服务端时会涉及到对多个子进程的管理和框架问题,结合以往的实际开发经验,对这种模式的服务端设计做个简单的总结。
1. 核心模块
child_process和fs
child_process模块主要用于在主进程运行的时候衍生出独立于主进程的异步子进程。
fs模块主要用于在主进程内读取需要的配置文件
2. 实现方式
首先需要一个配置文件来配置子进程的信息,一般使用json文件,例如:
[
{
“name”:”game1”,
“path”:”Game/game1”,
“port”:1100,
“status”:0,
“des”:”子进程一”
},
{
“name”:”game2”,
“path”:”Game/game2”,
“port”:1200,
“status”:0,
“des”:”子进程二”
},
{
“name”:”game3”,
“path”:”Game/game3”,
“port”:1300,
“status”:0,
“des”:”子进程三”
}
]
这样一个json文件自定义了每个需要运行的子进程的名字,运行的js文件的路径,端口,服务端的状态,描述这些信息。
下面函数示例如可在运行的主进程的用这样一个方法去获取配置文件信息
/** * 获取配置文件 * @param {string}manifestUrl 配置json路径 * @returns {Promise<Array<any>>} */ private async getManifest(manifestUrl:string):Promise<Array<any>> { let manifest = []; let fileName = await path.resolve(__dirname,manifestUrl); let exists = await fs.existsSync(fileName); if (exists) { let manifestStr = awaitfs.readFileSync(fileName); if (manifestStr) { try { manifest = await JSON.parse(manifestStr.toString("utf-8")); } catch (e) { console.error(config.manifestFileName+ "错误!", e.message); } } } else { console.error(config.manifestFileName+ "不存在!"); process.exit(0); } return manifest; }
下面函数示例可运行一个单个的进程一个item就是获取到的配置对象的一个节点元素
/** * 运行一个实例 * @param item * @param restart */ private async runInstance(item: any, restart = 0) { let instanceObj = { name: item.name, desc: item.desc, path: item.path, port: item.port, status: item.status, cpu: "0%", memory: "0%", restart: restart, instance: null, version: "0" }; if (!instanceObj["timer"]){ instanceObj["timer"] = setTimeout(()=> { if (instanceObj.status== 0) { instanceObj.restart = 0; instanceObj["timer"]= null; delete instanceObj["timer"]; } }, 500); } if (item.status != 1) { let arg = { port: item.port, serverName: item.name, }; // 日志路径 let logPath = ""; let pathArr = item.path.split("/"); for (let i = 0; i< pathArr.length - 1; i++) logPath += pathArr[i] + "/"; instanceObj["logPath"]= logPath + "Logs.txt"; // fork模式运行 instanceObj.instance = cps.fork(path.resolve(__dirname,"./controller/" + item.path), [encodeURIComponent(JSON.stringify(arg))],{silent: true}); // 监听输出事件 instanceObj.instance.stdout.on("data",async (data: Buffer) => { // todo 写入流到 log.txt }); // 错误事件 instanceObj.instance.stderr.on("data",async (data: Buffer) => { // todo 重启 写入错误日志等等 }); // 接收消息 instanceObj.instance.on("message",async (msg: any) => { if (msg &&msg.method && this[msg.method]) { instanceObj &&instanceObj.instance && instanceObj.instance.send({ method: msg.method, data: await this[msg.method](...msg.arg) }) } }); } }
这种模式管理每个进程的内存,cpu 版本信息都很方便,所有子进程可以通过继承方式继承一个类,通过process.argv[2]进行端口,版本等信息的管理。
阅读更多
相关文章推荐
- Fork同时创建多个子进程方法
- fork同时创建多个子进程的方法
- C++ windows多线程 线程描述了进程内代码的执行路径。进程中同时可以有多个线程在执行,为了使他们能够同时运行,操作系统为每个线程轮流分配CPU时间片,为了充分地利用CPU提高软件产品的性能,一
- 在多个子进程处理SOCKET发信,程序很简单,有不好的地方请指点,运行环境AIX
- Unix网络编程:while中执行waitpid为什么能正确解决同时出现的多个子进程结束
- ★实验 9-2 1. 补全代码,实现以下功能 a) 调用pipe()创建无名管道 b) 调用fork创建一个子进程 c) 在父进程中向管道写入 “helloworld”, 同时打印出PID和写入
- nodejs进程后台运行
- docker如何创建一个运行后台进程的容器并同时提供shell终端
- centos7.2 同时运行多个php-fpm主进程
- 在Ubuntu下安装nodejs4.x,并实现开机自动启动forever进程守护nodejs应用后台运行
- python开启多个子进程并行运行的方法
- linux中fork同时创建多个子进程的方法
- 在VC中实现一次执行一个进程,如果同时打开两个,则报该程序已经运行
- nodejs在同一台服务器上部署并同时运行两个或以上服务端时,一个服务用户登录后会挤掉另一个用户的问题
- iis中应用程序池的作用就是分开进程,让服务器可以同时运行asp.net 1.1和 asp.net 2.0的程序,而互相不干扰。
- 进程控制:linux中fork同时创建多个子进程注意事项
- linux中fork同时创建多个子进程的方法(一)
- linux 结束 系统内运行的所有java进程(可同时停止websphere)
- docker如何创建一个运行后台进程的容器并同时提供shell终端
- linux中fork同时创建多个子进程的方法(二)