• [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)
  • 相关阅读:
    webpack + react 前端工程化实践和暂不极致优化
    图解Javascript——作用域、作用域链、闭包
    图解Javascript——变量对象和活动对象
    图解Javascript——执行上下文
    简单实用的进度条、时间轴
    Nginx配置文件nginx.conf中文详解(转)
    负载均衡——nginx理论
    JavaScript的闭包是什么意思以及作用和应用场景
    巧用HTML5给按钮背景设计不同的动画
    利用js的for循环实现一个简单的“九九乘法表”
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10498591.html
Copyright © 2020-2023  润新知