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 :)

26
demandé sur limboy 2011-08-16 05:37:17

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 utilisant IOLoop.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 un IOStream, qui peut également appeler add_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 que epoll ou select, Il peut le faire très efficacement.

    Un IOStream gère le streaming de données sur une seule connexion et utilise le IOLoop pour le faire de manière asynchrone. Par exemple, un {[6] } peut lire autant de données que possible, puis utiliser IOLoop.add_handler() pour attendre que plus de données soient disponibles.

  • Sur listen(), le HTTPServer crée un socket qui l'utilise pour écoutez les connexions en utilisant le IOLoop. Lorsqu'une connexion est obtenue, il utilise socket.accept() pour créer un nouveau socket qui est ensuite utilisé pour communiquer avec le client à l'aide d'un nouveau HTTPConnection.

    Le HTTPConnection utilise IOStream pour transférer des données vers ou à partir du client. Ce IOStream utilise le IOLoop pour le faire de manière asynchrone et non bloquante. De nombreux objets IOStream et HTTPConnection peuvent être actifs à la fois, Tous utilisant le même IOLoop.

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 :).

29
répondu mesilliac 2011-08-16 12:36:58