首页 > Web开发 > 详细

[Node.js] Child Process with fork() to handle heavy calculation process

时间:2019-03-08 22:40:24      阅读:163      评论:0      收藏:0      [点我收藏+]

When build server, if we have a API endpoint requires some heavy calculation process, it will block the whole world. In this post, we will see how to use ‘child_process‘ fork() to solve the problem;

 

Let‘s see the blocking code example:

const http = require(http);

const longComputation = () => {
    let sum = 0;
    for (let i = 0; i < 1e9; i++) {
        sum += i;
    }
    return sum;
}

const server = http.createServer();

server.on(request, (req, res) => {
    if (req.url === /compute) {
        const sum = longComputation();
        return res.end(`Sum is ${sum}`);
    } else {
        res.end(Ok);
    }
})

When we request ‘/compute‘ API endpoint, because of ‘longCompute‘, it blocks the world, no other request can go thought.

curl localhost:3000/compute

 

Let‘s see how to fix it:

1. We will create a compute.js to hold the ‘longCompute‘ function and also listen to the ‘message‘ event on the global:

// Compute.js
const longComputation = () => {
    let sum = 0;
    for (let i = 0; i < 1e9; i++) {
        sum += i;
    }
    return sum;
}

// listen the mssage event on the global
// then do the computation
process.on(message, (msg) => {
    const sum = longComputation();
    process.send(sum);
})

 

2. In server.js, instead of calling ‘longCompute‘ directly, we fork the compute.js;

Send signal to tell the compute file to start doing the job, then we also need to listen to the event come back after computation is done.

// start processing
compute.send(start);
// listen to the message
compute.on(message, sum => {
    res.end(`Sum is ${sum}`);
});

 

Full code for server.js

const http = require(http);
const {fork} = require(child_process);

const server = http.createServer();

server.on(request, (req, res) => {
    if (req.url === /compute) {
        const compute = fork(compute.js);
        // start processing
        compute.send(start);
        // listen to the message
        compute.on(message, sum => {
            res.end(`Sum is ${sum}`);
        });
    } else {
        res.end(Ok);
    }
});
server.listen(3000)

 

[Node.js] Child Process with fork() to handle heavy calculation process

原文:https://www.cnblogs.com/Answer1215/p/10498591.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!