
在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() 传递消息。
探讨了Master-Worker模式中主进程与工作进程的通信机制,包括Node.js的child_process模块实现,以及HTML5 WebWorker API如何解决前端UI渲染与长时间计算任务之间的阻塞问题。
15万+

被折叠的 条评论
为什么被折叠?



