Le 14 septembre 2017, nous avons publié une version actualisée de notre Politique de confidentialité. En utilisant video2brain.com vous vous engagez à respecter ces documents mis à jour. Veuillez donc prendre quelques minutes pour les consulter.

L'essentiel de Node.js

Contrôler les processus enfants avec Spawn

TESTEZ LINKEDIN LEARNING GRATUITEMENT ET SANS ENGAGEMENT

Tester maintenant Afficher tous les abonnements
Quand vous lancez un processus enfant, il serait intéressant d'obtenir des informations sur son fonctionnement. À la base, Node.js ne le permet pas. Vous pouvez contourner cette limitation à l'aide de l'utilitaire Spawn.
06:25

Transcription

Alors vous l'avez vu, exécuter une commande au sein de node.js c'est pas compliqué, mais qu'est-ce qui se passe maintenant si j'ai besoin de venir communiquer avec cette commande parce que là vous inbriquez une commande dans le serveur. C'est embêtant parce que pour le coup ici, imaginons que j'ai lancé une commande qui est par node, quelque chose comme ça. Je ne vais pas pouvoir interagir avec, avec exec. Heureusement, on a spawn qui existe, spawn ça va nous permettre de faire des communications entre les différents processus. C'est très intéressant parce que pour le coup on peut contrôler un processus depuis son parent. Alors je m'explique : pour l'exemple, j'ai créé comme ça un petit script qui met en place une intervalle, qui utilise process.stdout et qui fait une écriture d'un point toutes les secondes. Alors vous remarquerez également que j'ai utilisé de l'ECMAScript 6 c'est-à-dire qu'en fait là, concrètement je fais fonction hein, c'est exactement la même chose cette partie-là, que d'écrire function comme ça, sauf que j'utilise les formatages courts qui sont beaucoup plus propres et beaucoup plus simples et beaucoup plus lisibles. Donc vous pouvez le faire, il n'y a pas de souci hein, notre version de node le supporte. Ensuite, j'ai simplement ici, un process.stdin.on('data') donc quand je reçois de l'information, je vais sortir, je vais faire un exit. Imaginons que ça, je le lance directement, alors ça va fonctionner, ça va m'écrire des points, et si j'appuie sur Entrée, on va me dire que ça a été stoppé depuis le parent et ça s'arrête là. Maintenant, si je le lance au travers de mon exec, comme ça directement, et que je lance du coup mon serveur, qu'est-ce qui va se passer? Bah regardez, il ne se passe rien. Alors le gros problème c'est ça, c'est que exec ne va pas récupérer le tampon de la sortie d'un processus enfant pour vous l'afficher si vous ne le câblez pas et si vous ne faites rien avec. Avec spawn, vous aurez la possibilité directement d'écrire, Il y a un autre truc aussi d'ailleurs, c'est que si j'appuie sur Entrée ça ne va jamais sortir. Pour communiquer, on va utiliser spawn. Spawn c'est un utilitaire que vous allez trouver également sur child_process et que vous allez pouvoir utiliser facilement. Comment ça s'utilise une fois que vous l'avez déclaré ? Vous allez créé ici également un processus enfant, un child, et ça va être spawn l'utilitaire que vous allez appeler, avec un premier argument, ce que vous voulez lancer et ensuite derrière, les différents arguments de la ligne de commande. Alors notamment, moi ici, je vais juste lui mettre comme ça spawned.js qui est le fichier que je veux lancer. Donc en faisant ça, on pourrait se dire que ça va fonctionnner tout seul, et que ça va m'afficher de l'info, mais non, pas vraiment. Mais, on va pouvoir se câbler dessus. C'est-à-dire que je vais pouvoir récupérer ce qui sort de l'enfant pour le réafficher dans le parent, et pour ça, on va utiliser le child qu'on a là, donc ça va être « child. » et on va utiliser le stdout et on va pouvoir se câbler dessus et dès qu'il y a de l'information qui rentre, data, là je vais lui dire de récupérer ces datas là, encore une fois en ECMAScript 6 ici, et je vais lui dire, bah bien sûr de répercuter le même fonctionnement que pour l'enfant. C'était quoi ? C'était simplement un process.stdout, donc on va faire la même chose, et on va écrire ici dans le stdout de ce processus serveur le stdout de l'enfant qui arrive. Ça déjà, ça nous permettra de répercuter la logique et de récupérer les petits points C'est bien mais vous voyez, j'ai beau appuyer sur un trait, ça ne sort pas. Alors, ça veut dire qu'il va falloir aussi que l'on vienne câbler cette partie-là. Faut que je puisse dialoguer, faut que je puisse envoyer de l'information à mon enfant. Comment je fais pour récupérer de l'information et donc en envoyer à mon enfant ? Bah, il va falloir que j'écrive à mon enfant directement quand je vais écrire sur le parent. Comment vous faites ça ? Regardez, ici on avait câblé ça, donc on va le répercuter, on va le reprendre et effectivement, quand le stdin va recevoir de l'information sur le processus serveur, il va l'envoyer au processus enfant. Si vous me suivez bien, ça veut dire que concrètement, ici, on va utiliser le child et on va lui envoyer les data, et les data vont être répercutés dessus. Pour faire ça, on va utiliser le stdin de l'enfant et on va utiliser write qui permettra d'écrire la même chose que ce qu'on a sur le parent, vers l'enfant, et donc de tuer l'enfant, mais pas de tuer le processus parent. C'est là où ça devient intéressant, c'est que votre parent serveur continue à tourner tant que il n'a pas été tué. Ce qu'il faudrait en fait, c'est ici effectivement il faudrait aussi tuer le processus parent parce que sinon on va avoir un problème, mais ça peut être aussi dans certains cas quelque chose d'intéressant puisque ce que vous avez là dans les datas, vous pouvez les récupérer. Ça peut vouloir dire que on a envie de jouer à une autre commande et à ce moment-là, on pourrait créer un script qui en joue plusieurs et qui en arrête plusieurs, et jouer avec ce qui est envoyé. Ça, ce n'est pas un problème. En faisant ça, on a créé une communication entre l'enfant et le parent. Par contre, vous remarquez quelque chose, c'est que le fait d'avoir ici, envoyé de l'information, on demande à l'enfant d'écrire en console quand il reçoit quelque chose, le problème, c'est que directement dans la foulée, on est en train d'éteindre le parent et vous voyez, ce n'est pas assez rapide. Donc concrètement ici il n'a pas le temps, l'enfant, de nous afficher sa sortie. Alors le plus intéressant évidemment, ici, ce serait de mettre également un petit Timeout pour éviter l'effet de bord, du fait qu'on tue le processus parent ça tue l'enfant en même temps, et du coup, bah on n'a pas l'information. Donc là, on pourrait lui dire que il attend deux petites secondes avant de vraiment tuer le parent et comme ça on aura au moins l'écriture de l'enfant stoppée par le parent, pas de problème. Alors si vous voulez, vous pouvez même logiquement hein, descendre carrément, à quelque chose de très très court, l'idée étant d'avoir juste un tout petit temps delta entre le moment où l'enfant va s'éteindre et le parent va s'éteindre aussi. Faut que vraiment tout soit un petit peu huilé. Donc ça a pressé un petit peu dans la pratique, c'est bien vous l'ayez vu. Ici, pensez bien à ça. Maintenant, si vous avez besoin de travailler avec des processus et que vous avez besoin d'écrire des choses en ces processus pour travailler et dialoguer avec, vous avez la possibilité de le faire, il suffira d'utiliser non pas exec mais spawn qui bénéficie d'une API beaucoup plus intéressante quand on doit faire du dialogue entre parent et enfant.

L'essentiel de Node.js

Exploitez les possibilités de Node.js et créez des applications côté serveur entièrement en JavaScript. Travaillez avec des requêtes web, gérez le protocole WebSocket, etc.

4h00 (44 vidéos)
Aucun commentaire n´est disponible actuellement
 
Logiciel :
Node.js Node.js 7.0
Spécial abonnés
Votre/vos formateur(s) :
Date de parution :26 déc. 2016
Durée :4h00 (44 vidéos)

Votre formation est disponible en ligne avec option de téléchargement. Bonne nouvelle : vous ne devez pas choisir entre les deux. Dès que vous achetez une formation, vous disposez des deux options de consultation !

Le téléchargement vous permet de consulter la formation hors ligne et offre une interface plus conviviale. Si vous travaillez sur différents ordinateurs ou que vous ne voulez pas regarder la formation en une seule fois, connectez-vous sur cette page pour consulter en ligne les vidéos de la formation. Nous vous souhaitons un excellent apprentissage avec cette formation vidéo.

N'hésitez pas à nous contacter si vous avez des questions !