当前位置 : 主页 > 网络编程 > JavaScript >

详解如何利用Nodejs构建多进程应用

来源:互联网 收集:自由互联 发布时间:2023-02-08
目录 前言 进程的创建和使用 多核利用率 创建子进程 进程间通信 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');
    }
    

    网友评论