Bien que Node ait plusieurs threads, JavaScript exécuté sur la v8 est monothread. Le module child_process de Node est utilisé pour créer des processus enfants, et nous pouvons utiliser pleinement le processeur via les processus enfants. Exemple :
Voici quelques méthodes de création de processus, y compris fork :
1.spawn(command, [args], [options]), démarre un nouveau processus pour exécuter la commande command, args est le paramètre de ligne de commande
2.exec(commande, [options], rappel), démarre un nouveau processus pour exécuter la commande commande, le rappel est utilisé pour obtenir l'entrée standard, la sortie standard et les informations d'erreur à la fin du processus
3.execFile(file, [args], [options], [callback]), démarre un nouveau processus pour exécuter le fichier exécutable, le rappel est utilisé pour obtenir l'entrée standard, la sortie standard et les informations d'erreur à la fin du processus
4.fork(modulePath, [args], [options]), démarre un nouveau processus pour exécuter un module de fichier JavaScript, et un processus enfant Node est créé à ce moment
Communication inter-processus des nœuds
Processus parent
Processus enfant
Il convient de noter que la méthode d'envoi ici est synchrone, il n'est donc pas recommandé d'envoyer de grandes quantités de données (vous pouvez utiliser pipe à la place, voir pour plus de détails : http://nodejs.org/api/ tout.html#child_process_child_process_spawn_command_args_options).
Dans des cas particuliers, si la valeur de l'attribut cmd dans le message contient le préfixe NODE_ (par exemple : message {cmd : 'NODE_foo'}), alors ce message ne sera pas soumis à l'événement message (mais à l'événement internalMessage), et ils sont utilisés en interne par Node.
send est :
Ici, sendHandle(handle) peut être utilisé pour envoyer :
1.net.Native, socket ou canal C TCP natif
2.net.Serveur, serveur TCP
3.net.Socket, socket TCP
4.dgram.Native, socket C UDP natif
5.dgram.Socket, socket UDP
Lorsque send envoie sendHandle, il n'envoie pas (et ne peut pas) envoyer d'objets JavaScript directement, mais envoie un descripteur de fichier (éventuellement envoyé sous forme de chaîne JSON). D'autres processus peuvent utiliser ce descripteur de fichier pour restaurer l'objet correspondant.
Regardons maintenant un exemple :
Processus parent
Processus enfant
Accédez à ce programme via le port 7000, et la sortie peut être connexion – parent ou connexion – enfant. Ici, le processus enfant et le processus parent écoutent sur le port 7000 en même temps. De manière générale, plusieurs processus écoutant le même port provoqueront une exception EADDRINUSE. Dans ce cas, deux processus différents utilisent le même descripteur de fichier et la couche inférieure de Node définit l'option SO_REUSEADDR sur le socket lors de l'écoute sur le port. permet à ce socket d'être réutilisé entre différents processus. Lorsque plusieurs processus écoutent le même port, le descripteur de fichier ne peut être utilisé que par un seul processus à la fois et l'utilisation des sockets par ces processus est préemptive.
module cluster
Le module cluster a été ajouté dans Node v0.8. Grâce au module cluster, vous pouvez facilement créer un groupe de processus écoutant le même port sur une machine physique. Exemple :
Nous appelons la méthode d'écoute dans le processus de travail, et la demande d'écoute sera transmise au processus maître. Si le processus maître dispose déjà d'un serveur d'écoute qui répond aux exigences du processus de travail, alors le handle de ce serveur sera transmis au travailleur. S'il n'existe pas, le processus maître en créera un puis transmettra le handle au processus maître. processus de travail.
Documentation plus détaillée sur le cluster : http://www.nodejs.org/api/cluster.html