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)