2016-11-03 63 views
1

我們正在Electron中構建一個應用程序,並且我們有兩個窗口,一個是主UI,另一個用作後臺進程以執行大量計算。 我們通過IPC消息兩個進程之間進行通信這樣的:IPC消息阻止了Electron的進程

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的一些其他信息,而它正在做沉重的事情計算,但我們不能這樣做。 我們遇到的問題是,在進行大量計算時,BP無法收到任何其他IPC消息。 所以,我們有這樣的流程:

  1. UI過程:發送啓動消息
  2. BP:接收開始測試消息
  3. BG過程:開始重計算
  4. UI過程:發送 - 不同測試消息
  5. BP:光潔度重計算
  6. BP:接收-不同測試消息

我們在後臺已經測試,像:

setTimeout(testFunction, 0); 

process.nextTick(testFunction); // node js process 

我們也TESTE節點JS async模塊。但IPC消息仍然被阻止。

所以,我們的問題是:我們該怎麼做,所以testFunction不會阻止其他IPC消息?

注:我們知道,我們可以使用的東西,如Web工人或節點子進程,但我們最後的選擇,因爲這將是太難管理數據併發性,因爲我們的後臺進程有很多數據的將被這個testFunction修改,也可以用BP將要接收的其他IPC消息修改

回答

0

就我而言,這個問題與事件循環有關,即一旦後臺進程開始其繁重的計算,在其進程中註冊的任何其他回調只是等待大量計算在執行之前完成。一個函數不能被同一進程中的另一個代碼中斷運行。

我想你必須有一個過程來管理繁重的計算隊列和一個或多個進程,以實際執行大量計算。除此之外,如果你想從繁重的計算過程中得到一些反饋,事情可能會變得更復雜一些,因爲繁重的過程將無法回答。解決方法是後臺進程向隊列管理器發送一些預定義的反饋。由於隊列管理器可以對消息作出響應,因此它會發送當前所擁有的當前反饋信息。