Javascript IPC消息正在阻止Electron中的进程
我们正在Electron中构建一个应用程序,我们有两个窗口,一个是主用户界面,另一个是后台进程,用于执行一些繁重的计算。 我们通过IPC消息在两个进程之间进行通信,如下所示: 用户界面流程:Javascript IPC消息正在阻止Electron中的进程,javascript,node.js,asynchronous,ipc,electron,Javascript,Node.js,Asynchronous,Ipc,Electron,我们正在Electron中构建一个应用程序,我们有两个窗口,一个是主用户界面,另一个是后台进程,用于执行一些繁重的计算。 我们通过IPC消息在两个进程之间进行通信,如下所示: 用户界面流程: ipcRenderer.send( 'start-test' ); 电子主流程: ipcMain.on('start-test', function (event, arg) { bgWindow.webContents.send('start-test', arg); }); 后台进程(BP)
ipcRenderer.send( 'start-test' );
电子主流程:
ipcMain.on('start-test', function (event, arg) {
bgWindow.webContents.send('start-test', arg);
});
后台进程(BP):
我们还测试了NodeJS模块。但IPC消息仍被阻止
所以,我们的问题是:我们能做些什么使testFunction不阻塞其他IPC消息
注意:我们知道可以使用Web Workers或节点子进程之类的工具,但这是我们最后的选择,因为管理数据并发太难了,因为我们的后台进程有很多数据,这些数据将通过这个testFunction进行修改,也可以通过BP将接收的其他IPC消息进行修改,就我而言,这个问题与事件循环有关,即,一旦后台进程开始其繁重的计算,在其进程中注册的任何其他回调都只是等待繁重的计算在执行之前完成。同一进程中的另一代码运行时,不能中断函数 我猜您必须有一个进程来管理大量计算的队列,并有一个或多个进程来实际执行大量计算。除此之外,如果你想从繁重的计算过程中得到一些反馈,事情可能会变得更复杂一些,因为繁重的过程将无法回答。解决方法是后台进程向队列管理器发送一些预定义的反馈。由于队列管理器可以响应消息,因此它将发送当前拥有的反馈信息
ipcRenderer.on( 'start-test', function( event, arg ) {
testFunction()
});
function testFunction(){
for( let i=0; i<5000000000 ;i++){ }
}
setTimeout( testFunction, 0 );
process.nextTick( testFunction ); // node js process