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服务试了一下。这样是不是就可以利用多核服务器的资源了呢。
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(); // 关闭此子进程
});
}
});
解释
-
创建子进程
var child = require('child_process').fork('child.js');
这行代码使用
fork()
方法创建了一个新的子进程,并指定了子进程的入口文件为child.js
。 -
创建HTTP服务器
var server = require('http').createServer(function(req, res) { res.end('This is the parent process handling the request.'); });
这里我们创建了一个HTTP服务器,它会在接收到请求时返回一条消息。
-
启动服务器
server.listen(3698, function() { child.send('message', server); });
我们启动了HTTP服务器,并在启动后通过
child.send()
方法将服务器对象传递给子进程。 -
监听connection事件
server.on("connection", function(socket) { socket.end("Handle by parent"); });
父进程在接收到HTTP连接时会结束连接,并返回"Handle by parent"。
-
接收消息并处理连接
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.js
的 child_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 资源。
这样设置可以用于简单的负载均衡场景,但更复杂的应用可能需要考虑更高级的负载均衡策略。