2016-07-03 248 views
8

我正在使用Node v6.2.2和Electron v1.2.5。在Electron中產生子進程

我有一個小的應用程序,我已經建立在Electron上,現在我需要fork這個進程在另一個節點進程中運行一些長時間運行的任務,但它似乎不工作,當我在尋找在ChildProcess對象我可以看到,在參數spawnargs [0]初始化電子可執行文件而不是節點,所以我所做的是我試圖用spawn來代替,但它不工作,據我所知。

這裏是我使用spawn過程(該文件./modules/tester.js生活)代碼:

const {spawn} = require('child_process'); 

var child = spawn("node", ["worker.js"], { stdio: ['inherit', 'inherit', 'inherit', 'ipc'] }); 

const self = {}; 

self.start =() => { 
    console.log("start"); 
    child.send("ping"); 
}; 

這裏是代碼,我用我的worker.js文件:

process.on("message", (data) => { 
    console.log(data); 
    console.log("pong"); 
}); 

最後這就是我如何消費它。

const {app} = require("electron"); 

const tester = require("./modules/tester"); 

app.on("ready",() => { 
    tester.start(); 
}); 

也許我做錯了,但我不這麼認爲,因爲當我使用nodejs它似乎工作得很好。

我已經嘗試了很多例子,但沒有一個似乎能夠工作,另一種可能性是我需要在Electron中做一些特殊的工作,但我不知道。

+0

從技術上講,Main和Renderer已經有兩個進程。在主流程上運行太多了嗎? – Josh

+0

@Josh是的,因爲我正在運行一個dns查找,我需要快速執行,但我有一個解決方案,但我做的是當我運行應用程序時我也開始一個新的外部的NodeJS實例,並通過IPC與NodeJS和Electron進行通信。 –

回答

3

最後,我解決了它。

我解決這個問題的方式正好相反,NodeJS在生產機器上可用,所以我只寫了一個start.js腳本,基本上生成一個子進程來運行Electron,並在父進程上運行這個長時間運行任務,最後我使用IPC在兩個進程之間進行通信。

+0

你還在使用這種「預分叉」方法還是你曾經產卵過? – Fraser

+0

@Fraser嗯,我不再在項目上工作,所以我沒有改變它。 :) –

4

如果您正在編譯電子--asar標誌,based on the docs這將是一個問題。

還有this issue您不能將stdio連接到父級。所以假設有一個分離的stdio不是一個交易斷路器,你可以試試{ stdio: 'ignore' }

相關問題