在Master-Worker模式中,要实现主进程管理和调度工作进程的功能,需要主进程和工作进程之间的通信。对于 child_process
模块,创建好了子进程,然后与父子进程间通信是十分容易的。
在前端浏览器中,JavaScript主线程与UI渲染共用同一个线程。执行JavaScript的时候UI渲染是停滞的,渲染UI时,JavaScript是停滞的,两者互相阻塞。长时间执行JavaScript将会造成UI停顿不响应。
为了解决这个问题,HTML5提出了WebWorker API。WebWorker允许创建工作线程并在后台运行,使得一些阻塞较为严重的计算不影响主线程上的UI渲染。
主线程与工作线程之间通过 onmessage()
和 postMessage()
进行通信,子进程对象则由 send()
方法实现主进程向子进程发送数据, message
事件实现收听子进程发来的数据,与API在一定程度上相似。通过消息传递内容,而不是共享或直接操作相关资源,这是较为轻量和无依赖的做法。Node中对应示例如下所示:
// parent.js
var cp = require('child_process');
var n = cp.fork(__dirname + '/sub.js');
n.on('message', function (m) {
console.log('PARENT got message:', m);
});
n.send({ hello: 'world' });
// sub.js
process.on('message', function (m) {
console.log('CHILD got message:', m);
});
process.send({ foo: 'bar' });
通过 fork()
或者其他API,创建子进程之后,为了实现父子进程之间的通信,父进程与子进程之间将会创建IPC通道。通过IPC通道,父子进程之间才能通过 message
和 send()
传递消息。