【发布时间】:2017-03-17 07:53:51
【问题描述】:
我们正在用 Electron 构建一个应用程序,我们有两个窗口,一个是主 UI,另一个用作后台进程来执行一些繁重的计算。 我们通过这样的 IPC 消息在两个进程之间进行通信:
用户界面流程:
ipcRenderer.send( 'start-test' );
电子主进程:
ipcMain.on('start-test', function (event, arg) {
bgWindow.webContents.send('start-test', arg);
});
后台进程(BP):
ipcRenderer.on( 'start-test', function( event, arg ) {
testFunction()
});
function testFunction(){
for( let i=0; i<5000000000 ;i++){ }
}
在 BP 进行繁重的计算时,我们需要一些其他信息,但我们做不到。 我们遇到的问题是 BP 在进行大量计算时无法接收任何其他 IPC 消息。 所以,我们有这样的流程:
- UI 进程:发送启动消息
- BP:接收开始测试消息
- BG 进程:开始大量计算
- UI 流程:发送不同的测试消息
- BP:完成繁重的计算
- BP:接收不同的测试消息
我们在后台进行了测试,例如:
setTimeout( testFunction, 0 );
process.nextTick( testFunction ); // node js process
我们还测试了 Node js async 模块。但是 IPC 消息仍然被阻止。
所以,我们的问题是:我们能做些什么来让 testFunction 不阻塞其他 IPC 消息?
注意:我们知道我们可以使用 Web Workers 或 Node Child Process 之类的东西,但这是我们最后的选择,因为管理数据并发性太难了,因为我们的后台进程有一个很多数据会被这个 testFunction 修改,也可以被 BP 接收到的其他 IPC 消息修改
【问题讨论】:
标签: javascript node.js asynchronous ipc electron