qu'est-ce que la tornade ioloop, et le flux de travail de tornado?
Je veux connaître le flux de travail interne de tornado, et j'ai vu Cet article , c'est génial, mais quelque chose que je ne peux pas comprendre
Dans le ioloop.py, il y a une telle fonction
def add_handler(self, fd, handler, events):
"""Registers the given handler to receive the given events for fd."""
self._handlers[fd] = handler
self._impl.register(fd, events | self.ERROR)
Alors, quel est-ce que cela signifie? chaque requête déclenchera add_handler ou elle est juste déclenchée une fois lors de l'initialisation?
Chaque Socket connect va générer un descripteur de fichier , ou il est juste généré une fois?
Quelle est la relation entre ioloop et iostream ?
Comment httpserver fonctionne avec ioloop et iostream ?
Y a-t-il un diagramme de flux de travail, donc je peux le voir clairement ?
Désolé pour ces questions, je viens de confondre
Tout lien, suggestion, astuce aide. merci beaucoup :)
1 réponses
, je vais voir si je peux répondre à vos questions dans l'ordre:
-
Ici
_impl
est le mécanisme d'interrogation de socket disponible,epoll
sous Linux,select
sous Windows. Ainsi,self._impl.register(fd, events | self.ERROR)
transmet la requête "wait for some event" au système d'exploitation sous-jacent, y compris spécifiquement les événements d'erreur.Lors de l'exécution, le
HTTPServer
enregistrera les sockets pour accepter les connexions, en utilisantIOLoop.add_handler()
. Lorsque les connexions sont acceptées, elles généreront plus de sockets de communication, ce qui il est également probable d'ajouter des gestionnaires d'événements via unIOStream
, qui peut également appeleradd_handler()
. Ainsi, de nouveaux gestionnaires seront ajoutés à la fois au début et au fur et à mesure que les connexions sont reçues. Oui, chaque nouvelle connexion socket aura un descripteur de fichier unique. Le socket d'origine sur lequel
HTTPServer
écoute devrait cependant conserver son descripteur de fichier. Les descripteurs de fichiers sont fournis par le système d'exploitation.-
Le
IOLoop
gère les événements à faire avec les sockets, par exemple s'ils ont données disponibles pour être lues, si elles peuvent être écrites et si une erreur s'est produite. En utilisant des services de système d'exploitation tels queepoll
ouselect
, Il peut le faire très efficacement.Un
IOStream
gère le streaming de données sur une seule connexion et utilise leIOLoop
pour le faire de manière asynchrone. Par exemple, un {[6] } peut lire autant de données que possible, puis utiliserIOLoop.add_handler()
pour attendre que plus de données soient disponibles. -
Sur
listen()
, leHTTPServer
crée un socket qui l'utilise pour écoutez les connexions en utilisant leIOLoop
. Lorsqu'une connexion est obtenue, il utilisesocket.accept()
pour créer un nouveau socket qui est ensuite utilisé pour communiquer avec le client à l'aide d'un nouveauHTTPConnection
.Le
HTTPConnection
utiliseIOStream
pour transférer des données vers ou à partir du client. CeIOStream
utilise leIOLoop
pour le faire de manière asynchrone et non bloquante. De nombreux objetsIOStream
etHTTPConnection
peuvent être actifs à la fois, Tous utilisant le mêmeIOLoop
.
J'espère que cela répond à certaines de vos questions. Je n'ai pas connaissez un bon graphique structurel, mais l'idée globale devrait être assez similaire pour les autres serveurs web, donc il pourrait y avoir de bonnes informations autour. Cet article en profondeur que vous avez lié à l'air assez utile, donc si vous comprenez assez, je vous recommande de lui donner un autre coup :).