web-dev-qa-db-fra.com

Générer un processus enfant dans Electron

J'utilise Node v6.2.2 et Electron v1.2.5.

J'ai une petite application que j'ai construite sur Electron et je dois maintenant fork le processus pour exécuter une tâche longue dans un autre processus de noeud, mais cela ne semble pas fonctionner, lorsque je regarde l'objet ChildProcess. Je peux voir que dans l'argument spawnargs [0] est initialisé avec l'exécutable electron au lieu de node. J'ai donc essayé d'utiliser spawn à la place, mais cela ne fonctionne pas aussi loin que je peux le dire.

Voici le code que j'utilise pour spawn le processus ( lives à l'intérieur du fichier ./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");
};

Et voici le code que j'utilise pour mon fichier worker.js:

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

Et finalement c'est comme ça que je le consomme.

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

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

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

Peut-être que je me trompe, mais je ne le pense pas, car lorsque j'utilise nodejs, cela semble fonctionner correctement.

J'ai essayé de nombreux exemples mais aucun d'entre eux ne semble fonctionner. Une autre possibilité est que je doive faire quelque chose de spécial dans Electron pour que cela fonctionne, mais je ne sais pas.

13
Eyal Solnik

Enfin, je l'ai résolu.

La façon dont j'ai résolu ce problème est exactement l'inverse: NodeJS est disponible sur les machines de production. Je viens d'écrire un script start.js qui génère un processus enfant pour exécuter Electron et sur le processus parent, j'exécute cette tâche longue utilise IPC pour communiquer entre les deux processus. 

3
Eyal Solnik

Si vous compilez Electron avec l'indicateur --asar, en fonction de la documentation , cela poserait un problème.

Il y a aussi ce problème où vous ne pouvez pas avoir la stdio attachée au parent. Donc, en supposant qu’une stdio détachée ne soit pas un facteur décisif, vous pouvez essayer { stdio: 'ignore' }.

5
Josh

En outre, vous pouvez créer un fichier nodejs dans le processus electron

let serverProc = require('child_process').fork(
  require.resolve('./server.js'),
  ['--key', 'value'], // pass to process.argv into child
  {
    // options
  }
)
serverProc.on('exit', (code, sig) => {
  // finishing
})
serverProc.on('error', (error) => {
  // error handling
})
1
Kirill Gusyatin