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
_implest le mécanisme d'interrogation de socket disponible,epollsous Linux,selectsous 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
HTTPServerenregistrera 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
IOLoopgè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 queepollouselect, Il peut le faire très efficacement.Un
IOStreamgère le streaming de données sur une seule connexion et utilise leIOLooppour 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(), leHTTPServercré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
HTTPConnectionutiliseIOStreampour transférer des données vers ou à partir du client. CeIOStreamutilise leIOLooppour le faire de manière asynchrone et non bloquante. De nombreux objetsIOStreametHTTPConnectionpeuvent ê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 :).