node.js中fork与spawn的区别child_process进程间通信


发布者 ourjs  发布时间 1677659089592
关键字 Node.JS 


fork与spawn都比较适合有大量交互文本的进程执行,他们的不同点:

1. fork可以直接开户一个新的node.js进程,只需要指定文件名即可
2. fork中的stdout, stderr通信stream默认是null, 通过 message 事件通信

比如

//开启进程
const worker = fork(__filename, [ 'child' ])

//父进程接收消息
worker.on('message', (data: any) => {
console.log('message', data)
})

worker.send({ method, args })

//子进程
if (process.argv[2] === 'child') {
console.log("Does it have?", worker.stdout, worker.stderr)
worker.send({ method, args })
}

fork子进程与主进程之间通过IPC channel传递信息,即 message 事件传递:

const cp = require('child_process');
const n = cp.fork(`${__dirname}/sub.js`);

n.on('message', (m) => {
console.log('PARENT got message:', m);
});

// Causes the child to print: CHILD got message: { hello: 'world' }
n.send({ hello: 'world' });

然后子进程 `'sub.js'` 看起来可以像这样:

process.on('message', (m) => {
console.log('CHILD got message:', m);
});

// Causes the parent to print: PARENT got message: { foo: 'bar', baz: null }
process.send({ foo: 'bar', baz: NaN });

spawn方法的特点:

1. 可以执行非node.js进程
2. 一般进程间通过 stdout/ stderr 这两个进行通信,并且需要手动序列化 JSON.parse/stringify

const worker = spawn(process.argv[0], [ __filename, 'child' ])

console.log("Does it have?", worker.stdout, worker.stderr)

worker.stderr?.on('data', (data: any) => {
console.log('Received child error', data.toString())
// reject(data.toString())
})

worker.stdout?.on('data', (data: any) => {
console.log('Received child data', data.toString())
// reject(data.toString())
})


//... 子进程发送消息

process.stderr.write('message')

 

 









  开源的 OurJS
OurJS开源博客已经迁移到 OnceOA 平台。

  关注我们
扫一扫即可关注我们:
OnceJS

OnceOA