IPC消息阻止了Electron

时间:2016-11-03 16:15:05

标签: javascript node.js asynchronous ipc electron

我们正在Electron中构建一个应用程序,我们有两个窗口,一个是主UI,另一个用作后台进程来进行一些繁重的计算。 我们通过这样的IPC消息在两个进程之间进行通信:

UI流程:

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无法接收任何其他IPC消息。 所以,我们有这样的流程:

  1. UI流程:发送启动消息
  2. BP:收到开始测试消息
  3. BG流程:开始繁重的计算
  4. UI流程:发送不同的测试消息
  5. BP:完成繁重的计算
  6. BP:收到不同的测试消息
  7. 我们在后台进行了测试,例如:

    setTimeout( testFunction, 0 );
    
    process.nextTick( testFunction ); // node js process
    

    我们还测试了Node js async模块。但IPC消息仍然被阻止。

    所以,我们的问题是:我们可以做什么,以便testFunction不会阻止其他IPC消息?

    注意:我们知道我们可以使用像Web Workers或Node Child Process这样的东西,但这是我们的最后一个选择,因为它太难以管理数据并发,因为我们的后台进程有一个很多数据将被此testFunction修改,也可以使用BP将收到的其他IPC消息进行修改

1 个答案:

答案 0 :(得分:0)

就我而言,这个问题与事件循环有关,即一旦后台进程开始繁重的计算,在其进程中注册的任何其他回调只是等待繁重的计算在它们执行之前完成。对于同一进程中的其他代码,永远不能中断函数。

我猜你必须有一个进程来管理繁重的计算队列和一个或多个进程来实际进行繁重的计算。除此之外,如果你想从繁重的计算过程中获得一些反馈,事情可能会变得更加复杂,因为沉重的过程将无法回答。解决方法是后台进程向队列管理器发送一些预定义的反馈。由于队列管理器可以响应消息,因此它会发送它当前拥有的当前反馈信息。