Nodejs Child Process小记

Nodejs Child Process小记

看了一下官网的Child Process文档,做个笔记,大家一起学习一下,详情请查看官网文档, parentS.js代码如下:

var child = require('child_process').fork('child.js');//child.js对应子进程程序文件

var server = require('http').createServer(function(req,res)
	{

	});
server.listen(3698,function(req,res)
	{
		child.send('message', server);//传递server,并通知子进程监听此http服务connection事件
	});
 console.log("listening 3698..");


 server.on("connection",function(req,res)
     {
     	req.end("handle by parent");
     });

child.js代码如下:

process.on('message', function(m,server) {
  if (m=='message') {

     server.on("connection",function(req,res)
     {
     	req.end("handle by child");
     	//process.disconnect();   //关闭此child进程
     });
  }
});

略微解释一下:

进入目录,node parentS.js一下,可以查看到启动了两个node进程,父进程通过child.send(‘message’, server)把server服务传递给了子进程,并且子进程也监听了server的connection消息,这样在浏览器下输入"http://127.0.0.1:3698/"会看到输出,到底是哪个进程处理了connection请求呢,答案是不确定的,两个进程都有机会去处理connection连接,大家可以不停的请求试试看。看了官网的文档,文档给的例子是父进程传递给子进程的是net服务、socket等,我就写了一下传递http服务试了一下。这样是不是就可以利用多核服务器的资源了呢。


4 回复

Nodejs Child Process小记

概述

在Node.js中,child_process模块允许我们在单个Node.js进程中创建子进程,并与这些子进程进行通信。本文将通过一个简单的示例来展示如何使用child_process.fork()方法来创建子进程,并在父进程和子进程之间传递数据。

示例代码

parentS.js

var child = require('child_process').fork('child.js'); // 创建子进程并指定子进程文件为child.js

var server = require('http').createServer(function(req, res) {
    res.end('This is the parent process handling the request.');
});

server.listen(3698, function() {
    child.send('message', server); // 将HTTP服务传递给子进程,并通知子进程监听connection事件
});

console.log("listening on port 3698...");

server.on("connection", function(socket) {
    socket.end("Handle by parent");
});

child.js

process.on('message', function(m, server) {
    if (m == 'message') {
        server.on("connection", function(socket) {
            socket.end("Handle by child");
            // process.disconnect();  // 关闭此子进程
        });
    }
});

解释

  1. 创建子进程

    var child = require('child_process').fork('child.js');
    

    这行代码使用fork()方法创建了一个新的子进程,并指定了子进程的入口文件为child.js

  2. 创建HTTP服务器

    var server = require('http').createServer(function(req, res) {
        res.end('This is the parent process handling the request.');
    });
    

    这里我们创建了一个HTTP服务器,它会在接收到请求时返回一条消息。

  3. 启动服务器

    server.listen(3698, function() {
        child.send('message', server);
    });
    

    我们启动了HTTP服务器,并在启动后通过child.send()方法将服务器对象传递给子进程。

  4. 监听connection事件

    server.on("connection", function(socket) {
        socket.end("Handle by parent");
    });
    

    父进程在接收到HTTP连接时会结束连接,并返回"Handle by parent"。

  5. 接收消息并处理连接

    process.on('message', function(m, server) {
        if (m == 'message') {
            server.on("connection", function(socket) {
                socket.end("Handle by child");
            });
        }
    });
    

    子进程通过process.on('message')监听来自父进程的消息,并在接收到消息后设置自己的connection事件处理器。

结果

当你访问 http://127.0.0.1:3698/ 时,可能会看到不同的结果,因为父进程和子进程都有机会处理连接。你可以不断刷新页面来观察哪个进程最终处理了连接。

总结

通过这种方式,我们可以利用多个Node.js进程来处理请求,从而更好地利用多核CPU的优势。这在处理高并发场景时特别有用。


写的不错.

建议可以直接用cluster 用法差不多

Node.jschild_process 模块允许我们在一个进程中创建新的子进程,并且可以在它们之间进行通信。这种机制非常有用,特别是在需要利用多核 CPU 来提高应用性能或扩展应用时。

下面是基于您提供的示例,对如何使用 child_process.fork() 创建子进程,并在父进程与子进程之间传递信息(例如 HTTP 服务)进行简要说明:

父进程 (parentS.js)

var child = require('child_process').fork('child.js');

var server = require('http').createServer((req, res) => {
    res.end("Request received by parent process");
});

server.listen(3698, () => {
    child.send('message', server);
});

console.log("Listening on port 3698...");

server.on("connection", (socket) => {
    console.log("Connection received by parent process.");
});

子进程 (child.js)

process.on('message', (msg, server) => {
  if (msg === 'message') {
    server.on("connection", (req, res) => {
        res.end("Request handled by child process");
        // process.disconnect();
    });
  }
});

解释

  • 在父进程中,我们创建了一个 HTTP 服务器并监听 3698 端口。当服务器开始监听后,我们将该 HTTP 服务器对象通过 child.send() 方法发送给子进程。

  • 在子进程中,我们监听来自父进程的消息。一旦接收到消息,并且消息为 'message',我们就在接收到的 HTTP 服务器上注册一个新的 connection 事件处理器,以便它可以处理传入的连接。

注意点

  • 子进程不会自动接管父进程创建的 HTTP 服务器上的所有连接。每个连接可能会被父进程或子进程随机处理,这取决于哪个进程首先接收到连接请求。
  • 使用这种方法可以实现在多个进程之间分担负载,从而更好地利用多核 CPU 资源。

这样设置可以用于简单的负载均衡场景,但更复杂的应用可能需要考虑更高级的负载均衡策略。

回到顶部