2016-07-03 8 views
8

Używam Node v6.2.2 i Electron v1.2.5.Spawn proces potomny w Electron

Mam małą aplikację, którą zbudowałem na wierzchu Electrona i teraz muszę wykonać fork proces, aby uruchomić jakieś długo działające zadanie w innym procesie węzłowym, ale to nie działa, kiedy szukam na obiekcie ChildProcess widzę, że w argumencie spawnargs [0] jest inicjowane za pomocą pliku wykonywalnego elektronu zamiast węzła, więc to, co zrobiłem, próbowałem użyć zamiast tego spawn, ale nie działa tak daleko, jak to możliwe.

Oto kod używam do spawn procesu (mieszka wewnątrz pliku ./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"); 
}; 

I Oto kod używam dla mojego worker.js pliku:

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

I w końcu tak go konsumuję.

Może robię to źle, ale nie sądzę, ponieważ kiedy używam nodejów, wydaje mi się, że działa dobrze.

Próbowałem wielu przykładów, ale żaden z nich nie działa, inną możliwością jest to, że muszę zrobić coś specjalnego w Electron, aby działał, ale nie wiem.

+0

Technicznie masz już dwa procesy z głównym i rendererem. Czy to zbyt dużo, aby uruchomić proces główny? – Josh

+0

@Josh Tak, ponieważ uruchamiam wyszukiwanie dns i muszę to zrobić szybko, mam rozwiązanie na miejscu, ale to, co zrobiłem, to gdy uruchamiam aplikację, również zaczynam nowy instancja NodeJS z zewnątrz i komunikacja NodeJS i Electron przez IPC. –

Odpowiedz

3

W końcu to rozwiązałem.

Sposób, w jaki rozwiązałem ten problem, jest dokładnie odwrotny, NodeJS jest dostępny na maszynach produkcyjnych, dlatego właśnie napisałem skrypt start.js, który zasadniczo odradza proces potomny do uruchomienia elektronu, a na proces macierzysty uruchamiam to długotrwałe działanie Zadanie i wreszcie używam IPC do komunikacji między dwoma procesami.

+0

czy nadal używasz tej metody "przed rozwidleniem", czy też kiedykolwiek spawn do pracy? – Fraser

+0

@Fraser Cóż, nie pracuję już nad projektem, więc go nie zmieniłem. :) –

4

Jeśli kompilujesz elektrony z flagą --asar, based on the docs to będzie problem.

Istnieje również this issue, gdzie nie można dołączyć stdio do rodzica. Zakładając, że posiadanie odłączonego stdio nie jest wyłącznikiem, możesz spróbować { stdio: 'ignore' }.