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


    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)
  • 相关阅读:
    java截取字符串
    Integer
    Sql语句常用关键字
    mybatis三种传值方式
    mybatis中的#和$的区别
    374. Guess Number Higher or Lower
    278. First Bad Version
    69. Sqrt(x)
    35. Search Insert Position
    167. Two Sum II
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10498591.html
Copyright © 2020-2023  润新知