zoukankan      html  css  js  c++  java
  • [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)
  • 相关阅读:
    Windows 运行 中的命令
    Base64 实现。名家手笔
    熊猫烧香病毒专杀及手动修复方案
    pdf病毒的源代码(VBS)
    Base64 实现。名家手笔
    pdf病毒的源代码(VBS)
    Code:关于加密解密 Base64 and URL and Hex Encoding and Decoding
    wmDrawer:实用的步骤启动器
    gnormalize:音频转换对象
    Avidemux:视频编纂软件
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10498591.html
Copyright © 2011-2022 走看看