2016-07-03 249 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' }

相关问题