Les modèles de la concurrence dans nodejs
Personne ne sait ce que la mémoire et les modèles de thread sont en nodejs?
En particulier, est ii++
atomique? T-il se comporter comme si ii
ont été volatile
en Java 1.5, dans Java 1.4, en C, ou pas du tout?
- Pour tous les soins node.js est mono-thread.
- Pas exactement. Javascript s'exécute sur un seul thread, mais le blocage IO est fait sur un thread séparé de la piscine. "Bien sûr, sur le backend, il y a des threads et de processus pour la DB d'accès et d'exécution des processus." Citation: blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop
- Correction: pour tous les vous entretien node.js est mono-thread.
Vous devez vous connecter pour publier un commentaire.
Il est utile de comprendre comment nœud et V8 interagir. Poignées de nœuds en attente d'e/S ou des minuteries à partir du système d'exploitation. Lorsque le nœud se réveille d'e/S ou une minuterie, il n'a généralement quelques rappels JavaScript pour appeler. Lorsque le nœud s'exécute ces rappels, le contrôle est passé en V8 jusqu'à V8 retourne vers le nœud.
Alors, si vous ne
var ii = 1; ii++;
, vous ne trouverez jamais que ii est rien d'autre que 2. Tous les JavaScript s'exécute jusqu'à la fin, et puis le contrôle est transmis vers le nœud. Si vous nedoSomething(); doSomething();
qui sera toujours courir doSomething deux fois, et il ne sera pas de retour vers le nœud de la boucle d'événements, jusqu'à la deuxième invocation de doSomething retourne. Cela signifie que vous pouvez complètement de verrouillage du nœud à partir d'une simple erreur comme ceci:Il n'a pas mater combien d'I/O rappels que vous avez enregistré, minuteries mis à tourner, ou de sockets en attente d'être lus. Jusqu'à V8 retourne à partir de cette boucle infinie, nœud n'a pas plus de travail.
C'est une partie de ce qui rend la programmation dans le nœud de façon à nice. Vous n'avez jamais à vous soucier de verrouillage. Il n'y a pas de conditions de course ou des sections critiques. Il n'y a qu'un seul thread où votre code JavaScript s'exécute.
9007199254740992 + 1
balance += 10
pourrait tout aussi bien échouer dans un seul thread asynchrone de l'environnement si les deux demandes se produire à la suite dans les opérations de base de données appelée dans l'ordre "lire, lire, lire, écrire".Il n'y a qu'un seul thread (la boucle d'événements) et de votre code n'est jamais interrompu, sauf si vous effectuez une action asynchrone comme I/O. Vous ne pouvez pas faire en parallèle de l'exécution du code. Donc ii++ est atomique.
Un bon article qui explique ce qu'est et n'est pas, asynchrone dans node.js est La compréhension de la node.js Boucle d'Événement. Si vous pouvez comprendre ce que vous serez en mesure d'identifier l'endroit où votre demande a async comportement et où il ne l'est pas. Par la compréhension de ce que vous pouvez écrire explicitement code séquentiel lorsque vous en avez besoin. EventEmitters sont la clé.
Singlethreadedness sons à l'encontre de l'idée que node.js est de haute performance et évolutive, ont donc un coup d'oeil à ce l'article de Yahoo sur des.