python - example - ¿Qué es el ioloop tornado y el flujo de trabajo del tornado?
python tornado example (1)
Veré si puedo responder a tus preguntas en orden:
Aquí
_impl
es el mecanismo de sondeo de socket disponible,epoll
en Linux,select
en Windows. De modo queself._impl.register(fd, events | self.ERROR)
pasa la solicitud de "espera de algún evento" al sistema operativo subyacente, que también incluye específicamente los eventos de error.Cuando se ejecuta, el
HTTPServer
registrará sockets para aceptar conexiones, utilizandoIOLoop.add_handler()
. Cuando se aceptan las conexiones, generarán más sockets de comunicación, lo que probablemente también agregará controladores de eventos a través de unIOStream
, que también puede llamar aadd_handler()
. Por lo tanto, los nuevos controladores se agregarán al principio y cuando se reciban las conexiones.Sí, cada nueva conexión de socket tendrá un descriptor de archivo único. Sin embargo, el socket original que está escuchando el
HTTPServer
debería mantener su descriptor de archivo. Los descriptores de archivos son proporcionados por el sistema operativo.IOLoop
maneja los eventos relacionados con los sockets, por ejemplo, si tienen datos disponibles para leer, si pueden escribirse y si se ha producido un error. Al utilizar servicios de sistemas operativos comoepoll
oselect
, puede hacerlo de manera muy eficiente.Un
IOStream
maneja la transmisión de datos a través de una sola conexión, y usaIOLoop
para hacer esto de forma asíncrona. Por ejemplo, unIOStream
puede leer tantos datos como estén disponibles, luego usarIOLoop.add_handler()
para esperar hasta que haya más datos disponibles.En
listen()
, elHTTPServer
crea un socket que utiliza para escuchar las conexiones que utilizanIOLoop
. Cuando se obtiene una conexión, usasocket.accept()
para crear un nuevo socket que luego se usa para comunicarse con el cliente usando una nuevaHTTPConnection
.La
HTTPConnection
utiliza unIOStream
para transferir datos hacia o desde el cliente. EsteIOStream
usaIOLoop
para hacer esto de forma asíncrona y sin bloqueo. Muchos objetosIOStream
yHTTPConnection
pueden estar activos a la vez, todos utilizando el mismoIOLoop
.
Espero esto conteste algunas de sus preguntas. No conozco un buen gráfico estructural, pero la idea general debería ser bastante similar para otros servidores web también, por lo que podría haber alguna buena información. Ese artículo detallado al que enlazaste parecía bastante útil, así que si comprendes lo suficiente, recomiendo darle otra oportunidad :).
Quiero conocer el flujo de trabajo interno del tornado, y he visto este artículo , es genial, pero es algo que no puedo entender.
dentro del ioloop.py, existe tal función
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)
Entonces, ¿qué significa esto? cada solicitud activará add_handler o solo se activará una vez cuando se inicie?
¿Cada conexión de socket generará un descriptor de archivo, o solo se generará una vez?
¿Cuál es la relación entre ioloop y iostream?
¿Cómo funciona httpserver con ioloop y iostream?
¿hay algún diagrama de flujo de trabajo, así que puedo verlo claramente?
perdon por estas questiones, me acabo de confundir
Cualquier enlace, sugerencia, punta ayuda. muchas gracias :)