2016-07-03 9 views
8

Ich benutze Node v6.2.2 und Electron v1.2.5.Spawn ein Kind Prozess in Elektron

Ich habe eine kleine Anwendung, die ich oben auf Electron gebaut habe und jetzt muss ich fork den Prozess, um einige lange laufende Aufgabe in einem anderen Knoten-Prozess zu laufen, aber es scheint nicht zu funktionieren, wenn ich schaue am ChildProcess Objekt kann ich sehen, dass in der Argumentation Spawnargs [0] mit der ausführbaren Elektron anstelle von Knoten initialisiert wird, also was ich getan habe, habe ich versucht, spawn stattdessen zu verwenden, aber es funktioniert nicht so weit, wie ich sagen kann. Hier

ist der Code, den ich zu spawn bin mit dem Prozess (Leben in der Datei ./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"); 
}; 

Und hier ist der Code Ich verwende für meine worker.js Datei:

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

Und schließlich ist das, wie ich es konsumiere.

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

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

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

Ich mache es falsch, aber ich glaube nicht, denn wenn ich NodeJS bin mit ihm ganz gut zu funktionieren scheint Vielleicht.

Ich habe viele Beispiele ausprobiert, aber keiner von ihnen scheint zu funktionieren, eine andere Möglichkeit ist, dass ich in Electron etwas Besonderes machen muss, damit es funktioniert, aber ich weiß es nicht.

+0

Technisch gesehen haben Sie bereits zwei Prozesse mit dem Main und dem Renderer. Ist es zu viel für den Main-Prozess? – Josh

+0

@Josh Ja, es ist, weil ich eine DNS-Lookup laufen und ich muss es schnell tun, habe ich eine Lösung an Ort und Stelle, was ich getan habe ist, wenn ich die Anwendung ausgeführt habe, ich fange auch ein neues an Instanz von NodeJS extern und NodeJS und Electron kommunizieren über IPC. –

Antwort

3

Endlich habe ich es gelöst.

Die Art, wie ich das gelöst habe, ist genau umgekehrt, NodeJS ist auf den Produktionsmaschinen verfügbar, also schrieb ich einfach ein start.js Skript, das im Grunde einen Kindprozess erzeugt, um Electron laufen zu lassen und auf dem Elternprozess lief ich das lange laufen Aufgabe und schließlich verwende ich IPC, um zwischen den zwei Prozessen zu kommunizieren.

+0

verwenden Sie immer noch diese "Pre-Forking" -Methode oder haben Sie jemals Spawn zur Arbeit bekommen? – Fraser

+0

@Fraser Nun, ich arbeite nicht mehr am Projekt, also habe ich es nicht geändert. :) –

4

Wenn Sie Elektron mit der --asar Flagge, based on the docs kompilieren, wäre das ein Problem.

Es gibt auch this issue, in denen Sie das stdio nicht an das übergeordnete Element anhängen können. Wenn man davon ausgeht, dass ein distanzierter stdio kein Deal-Breaker ist, kann man versuchen { stdio: 'ignore' }.