【问题标题】:IPC messages are blocking the process in ElectronIPC 消息阻塞了 Electron 中的进程
【发布时间】: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 消息。 所以,我们有这样的流程:

  1. UI 进程:发送启动消息
  2. BP:接收开始测试消息
  3. BG 进程:开始大量计算
  4. UI 流程:发送不同的测试消息
  5. BP:完成繁重的计算
  6. 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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 2016-01-03
      • 2022-01-11
      • 2017-07-08
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 2019-09-15
      • 1970-01-01
      相关资源
      最近更新 更多