node多进程

进程的概念

  • 进程是一个实体,每个进程都有自己的地址空间
  • 进程是一个执行中的程序,存在嵌套关系

在macos系统中, 在命令行输入ps -ef, pid表示当前进程id, ppid表示当前进程的父进程id,而操作系统的桌面起始进程/sbin/launchd的的pid是1,ppid是0

可以根据ps -ef|grep node筛选属于node的进程

child_process用法

异步

  • exec
  • execFile
  • fork
  • spawn

exec用法

1
2
3
4
5
6
7
8
const cp = require('child_process')
const path = require('path');

cp.exec('ls -al|grep node_modules', function (err, stdout, stderr) {
console.log(err);
console.log(stdout);
console.log(stderr);
})

execFile用法

第一个参数是可执行文件的路径,第二个参数执行参数,第三个是回调函数

1
2
3
4
5
6
7
8
9
10
11
12
13

cp.execFile('ls', ['-al'], function (err, stdout, stderr) {
console.log(err);
console.log(stdout);
console.log(stderr);
})

// 这里要执行shell文件需要系统提供权限 chmod 777 ./test.shell
cp.execFile(path.resolve(__dirname, 'test.shell'), ['-al'], function (err, stdout, stderr) {
console.log(err);
console.log(stdout);
console.log(stderr);
})

spawn的用法

简单的shell脚本

1
2
3
ls -al|grep node_modules

echo $1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 第一个参数命令或者文件,会在系统中环境变量找到对应的文件
// spawn是流式执行方式,适用于耗时任务,可不断为用户提供日志反馈
const child = cp.spawn(path.resolve(__dirname, 'test.shell'), ['-al', '-bl'], {
cwd: path.resolve('./'),
stdio: 'inherit', //会逐行打印子进程的反馈日志
})

console.log(child.pid);

// 可以逐行显示出执行的结果
child.stdout.on('data', function (chunk) {
console.log('stdout', chunk.toString());
})

child.stderr.on('data', function (chunk) {
console.log('stderr', chunk.toString());
})


// exec/execFile: 开销较小的任务,最后一次性打印日志
cp.exec(path.resolve(__dirname, 'test.shell'), {
cwd: path.resolve('./')
}, function (chunk) {
console.log(chunk);
})

folk的用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

/** ./main_process.js **/
// fork: node(main) -> node(child)
// 两个进程是完全独立的
const child2 = cp.fork(path.resolve(__dirname, 'child.js'))

child2.send('hello child process', function (err) {
// child2.disconnect();
})

child2.on('message', function (msg) {
console.log(msg);
})
console.log('main process pid:' + process.pid)


/** ./child_process.js **/
console.log('child process')
console.log('child process pid: ' + process.pid)

process.on('message', function (msg) {
console.log(msg);

})

process.send('hello main process', () => {
process.disconnect();
})