目录 前言 进程的创建和使用 多核利用率 创建子进程 进程间通信 IPC 总结 前言 JavaScript 主线程运行在单个进程的单个线程上。这样做的好处是: 程序状态是单一的,在没有多线程的情
目录
- 前言
- 进程的创建和使用
- 多核利用率
- 创建子进程
- 进程间通信 IPC
- 总结
前言
JavaScript 主线程运行在单个进程的单个线程上。这样做的好处是:
- 程序状态是单一的,在没有多线程的情况下没有锁、线程同步问题,
- 操作系统在调度时因为较少上下文的切换,可以很好地提高CPU的使用率。
但是单进程单线程并非完美的结构,一旦线程中某段代码发生异常阻塞,会阻塞代码执行而浪费资源。同时,如今CPU基本均是多核的,服务器往往还有多个CPU。
因此 Nodejs 不可避免的面临两个问题:如何充分利用多核CPU
****和 ****如何保证进程的健壮性和稳定性
。 另外,由于 Nodejs 中所有处理都在单线程上进行,影响事件驱动服务模型性能的点在于CPU的计算能力,而不受多进程或多线程模式中资源上限的影响,可伸缩性远比前两者高。如果解决掉多核CPU的利用问题,带来的性能上提升是可观的。
进程的创建和使用
多核利用率
面对单进程单线程对多核使用不足的问题,最简单的方法是启动多进程即可。理想状态下每个进程各自利用一个CPU,以此实现多核CPU的利用。Nodejs 提供了 child_process模块
,并且也提供了child_process.fork()
方法帮助我们实现进程的复制。
你可以通过这个方法在本地启动多个 HTTP 服务,首先编写一段创建 http服务端
的代码:
const http = require("http"); const server = http.createServer((req, res) => { res.writeHead(200, { "Content-Type": "text/plain" }); res.end("hello,world!"); }); // 随机监听1000-1999的任意一个端口 server.listen(Math.floor((1 + Math.random()) * 1000));
然后创建一个主进程 master.js
来启动和管理他们:
const fork = require("child_process").fork; const cpus = require("os").cpus(); console.log(cpus.length); for (let i = 0; i < cpus.length; i++) { fork('./server.js'); }