child_process

spawn.js

const { spawn } = require('child_process');

const path = require('path');

//spwan
const cp = spawn('node', ['fib2.js'], {
    cwd: path.resolve(__dirname, '../other'),
    // stdio: [0, 1, 2],
    // stdio: ['pipe', 'pipe', 'pipe'],
    stdio: [0, 1, 2, 'ipc'],

})



cp.send('父发送请求')

cp.on('message', (data) => {
    console.log('父控制台:' + data)

})

// 流
// cp.stdout.on("data", function (data) {
//     console.log('父进程控制台:' + data.toString());

// })
// cp.stdout.write('父进程写入')


cp.on('error', (err) => {
    console.log(err);
})
cp.on('exit', (code, signal) => {
    console.log("子进程退出 " + code, signal);
})
cp.on('close', (code, signal) => {
    console.log("子进程关闭 " + code, signal);
})

fork.js

const {fork}= require('child_process')

const path = require('path')

//fork 默认调用node命令

const cp= fork('fib2.js',{
    cwd:path.resolve(__dirname,'../other'),
})



cp.send('父发送请求')

cp.on('message', (data) => {
    console.log('父控制台:' + data)

})


cp.on('error', (err) => {
    console.log(err);
})
cp.on('exit', (code, signal) => {
    console.log("子进程退出 " + code, signal);
})
cp.on('close', (code, signal) => {
    console.log("子进程关闭 " + code, signal);
})

execFile.js

const { execFile,exec } = require('child_process')

const path = require('path')

//cmd sh
// const cp = execFile('node',
//     ['execFileWorker.js'],
//     {
//         cwd: path.resolve(__dirname, '../other'),


//     }, (err, stdout, stderr) => {
//         console.log(stdout)
//     });

// const cp = execFile('ls',
//     ['-ll'],
//     {
//         cwd: path.resolve(__dirname, '../other'),


//     }, (err, stdout, stderr) => {
//         console.log(stdout)
//     });

const cp = exec('echo $PATH',
    {
        cwd: path.resolve(__dirname, '../other'),


    }, (err, stdout, stderr) => {
        console.log(stdout)
    });




cp.on('error', (err) => {
    console.log(err);
})
cp.on('exit', (code, signal) => {
    console.log("子进程退出 " + code, signal);
})
cp.on('close', (code, signal) => {
    console.log("子进程关闭 " + code, signal);
})

detacted.js

const {spawn}= require('child_process')

const path = require('path')

//fork 默认调用node命令

const cp= spawn('node',['writeFile.js'],{
    cwd:path.resolve(__dirname,'../other'),
    stdio:'ignore',
    detached:true,
})
cp.unref();



cp.on('error', (err) => {
    console.log(err);
})
cp.on('exit', (code, signal) => {
    console.log("子进程退出 " + code, signal);
})
cp.on('close', (code, signal) => {
    console.log("子进程关闭 " + code, signal);
})


/**
 * 
 * 
 

process.kill(进程id)


 */

claster-module.js

const cluster = require('cluster');
const http = require('http')
const { resolve } = require('path')

const cpus = require('os').cpus();


if (cluster.isMaster) {
    cpus.forEach(() => {
        cluster.fork();
    })
} else {
    http.createServer((req, res) => {
        res.end('child process ' + '\n' + process.pid + '\n')
    }).listen(3000)
}


cluster.setupMaster({
    exec: resolve(__dirname, './server.js')
})

for (let index = 0; index < cpus.length; index++) {
    cluster.fork();

}

// 守护进程

cluster.on('exit', (worker, code, signal) => {
    console.log(`work ${worker.process.pid}`);
    cluster.fork();
})

cluster.js

const http = require('http')

const { fork } = require('child_process');
const path = require('path')
const cpus = require('os').cpus()



const server = http.createServer((req, res) => {
    res.end('master' + '\n')

}).listen(3000)

for (let index = 0; index < cpus.length; index++) {
    const cp = fork('server.js', {
        cwd: path.resolve(__dirname, '.'),
    })
    // ipc 模式下 第二参数可以传入一个http服务 或者tcp服务
    cp.send('server', server)
}

get.js

const http = require('http')

setInterval(() => {
    http.get({
        hostname: 'localhost',
        port: 3000,
    }, (res) => {
        res.on('data', (chunk) => {
            console.log(chunk.toString())
        })
    })
});

server.js

const http = require('http')

const cpus = require('os').cpus();

const server = http.createServer((req, res) => {
    if(Math.random()>0.5){
        // 
    }
    res.end('master' + '\n')
}).listen(3000)





process.on('message', (msg, server) => {

    http.createServer((req, res) => {
        res.end(process.pid + '\n')
    }).listen(server)//多进程监听同一个端口

},500)

execFileWorker.js

process.stdout.write('第一行' + process.pid + '\n')
process.stdout.write('第二行' + process.pid + '\n')

fib2.js

function fib(n) {
    if (n <= 1) {
        return 1;
    }
    return fib(n - 1) + fib(n - 2)
}


// console.log('子进程控制台' + fib(40))


//流
// process.stdout.write('子进程写入')

// process.stdout.on("data", function (data) {
//     console.log('子进程控制台' + data.toString());

// })

// // ipc
process.on('message', function (data) {

    console.log('子进程拿父进程数据' + data)
})
process.send('子进程发送数据')



function throttel(fn, delay) {
    let last = 0
    return function (...args) {
        let now = Date.now();
        if (now - last > delay) {
            fn.apply(this.args);
            last = now
        }
    }
}

writeFile.js

const fs = require('fs')

setInterval(() => {
    fs.appendFileSync('test.txt', 'vic\n')
}, 1000)
Last Updated:
Contributors: 刘荣杰