74 votes

Comment fonctionne la programmation asynchrone dans un modèle de programmation à un seul thread?

Je passais en revue les détails de node.js et en suis venu à le savoir. Il prend en charge la programmation asynchrone, bien qu’il fournisse essentiellement un modèle à thread unique.

Comment la programmation asynchrone est-elle gérée dans de tels cas? Est-ce que c'est comme si le moteur d'exécution lui-même crée et gère les threads, mais le programmeur ne peut pas créer de threads explicitement? Ce serait formidable si quelqu'un pouvait m'indiquer des ressources pour en apprendre davantage à ce sujet.

94voto

RyanWilcox Points 7838

Dites-le avec moi maintenant: programmation asynchrone ne signifie pas nécessairement multi-thread.

Javascript est un seul thread d'exécution - vous ne sont tout simplement pas en mesure de créer de nouveaux threads en JS parce que la langue/runtime ne le supporte pas.

Frank, dit-il correctement (même si obscure) En anglais: il y a une boucle principale qui gère quand les choses viennent dans votre application. Ainsi, la "poignée de cette requête HTTP" sera ajouté à la boucle d'événements, puis traitées le cas échéant.

Lorsque vous appelez une opération asynchrone (une db mysql requête, par exemple), node.js envoie "hey, exécuter cette requête" de mysql. Depuis cette requête va prendre un certain temps (millisecondes), node.js effectue la requête à l'aide de la base de données MySQL async bibliothèque - pour en revenir à la boucle d'événements et de faire autre chose pendant que d'attente pour mysql de revenir à nous. Comme la manipulation que de la requête HTTP.

Edit: Par contre, node.js pourrait simplement attendre (ne rien faire) pour mysql, pour revenir à elle. Cela s'appelle un appel synchrone. Imaginez un restaurant, où votre serveur envoie votre commande à la faire cuire, puis s'assoit et twiddles ses pouces tandis que le chef cuisine. Dans un restaurant, comme dans un node.js au programme, un tel comportement est stupide - vous avez d'autres clients qui ont faim et ont besoin d'être servi. Ainsi vous voulez être comme asynchrones que possible pour s'assurer un garçon (ou node.js processus) est de servir comme beaucoup de gens qu'ils le peuvent.

Edit fait

Node.js communique avec mysql à l'aide de bibliothèques C, donc techniquement, les bibliothèques pourraient frayer hors threads, mais à l'intérieur de Javascript, vous ne pouvez pas faire n'importe quoi avec les threads.

13voto

Frank Points 1461

Ryan a dit le mieux: sync/async est orthogonal à simple/multi-thread. Pour la simple et multi-thread cas, il existe une boucle principale qui appelle rappels enregistrés à l'aide du Modèle de Réacteur. Pour le single-threaded cas, les rappels sont invoquées de manière séquentielle sur le thread principal. Pour le multi-thread cas où ils sont appelés sur des threads séparés (généralement à l'aide d'un pool de threads). C'est vraiment une question de combien de contention, il y aura: si toutes les demandes nécessitent un accès synchronisé à une seule structure de données (par exemple, une liste d'abonnés), puis les avantages d'avoir plusieurs filetée peut être diminuée. C'est le problème de la dépendance.

Aussi loin que la mise en œuvre, si un cadre est mono-thread, alors il est probablement à l'aide de sondage/sélectionnez appel système c'est à dire le système d'exploitation est le déclenchement de l'événement asynchrone.

0voto

Sandeep Points 71

Ryan a clairement expliqué le concept. Si vous venez d’un contexte de programmation Java comme moi, c’est peut-être le meilleur endroit pour commencer . En fait, je suggérerais de suivre ce tutoriel avant d’utiliser un des frameworks comme expressjs

0voto

agaase Points 333

Donc en bref node.js lorsque vous appelez une fonction asynchrone utilise à faible niveau d'API qui, comme l'a dit Ryan

Le fait que l'API asynchrone peut utiliser un pool de threads à l'interne, d'un faible niveau de détail que vous n'avez pas de soins sur

doit être fait que dans un environnement multi-thread façon. Est-il un autre moyen.?

Et si c'est un multi threaded processus, bien qu'à un faible niveau de la façon dont le rendement est optimisé par rapport à une normale de java processus qui démarre un nouveau thread pour chaque demande.??

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X