[pyar] Threads en tornado

Bruno Geninatti brunogeninatti en gmail.com
Mie Jun 3 09:58:19 ART 2015


Buenos días bella comunidad. Estoy probando unas cosas con tornado y
algunos recursos externos, a los que se accede via zmq.

La idea es que haya un websocket que envíe un mensaje proveniente del
recurso externo. Con lo cual los clientes sólo actuarían "pasivamente", ya
que no mandarían mensajes via el websocket, sólo recibirían las
actualizaciones.

Se me ocurrió algo así.

import zmq
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.web import Application
from tornado import websocket
from threading import Thread


class SocketHandler(websocket.WebSocketHandler):
    listeners = []
    def open(self, *args, **kwargs):
        SocketHandler.listeners.append(self)
        self.write_message('HI!')

    @classmethod
    def to_all(cls, msg):
        for l in cls.listeners:
            l.write_message(msg)

def report():
    context = zmq.Context()
    socket = context.socket(zmq.SUB)
    socket.connect("tcp://localhost:8000")
    while True:
        msg = socket.recv()
        SocketHandler.to_all(msg)

HTTPServer(Application([
("/socket", SocketHandler)
], debug=True)).listen(9999)

t = Thread(target=report).start()
IOLoop.instance().start()

Como en realidad no funcionaría como un request asíncrono de tornado, o por
lo menos de la forma en la que yo lo entiendo. Ya que en realidad el
cliente no hace requests si no que sólo escucha en el websocket y espera.
Por otro lado, el thread que reporta los mensajes no modifica ninguna
estructura, con lo cual no debería haber motivos por que no sea thread safe.
 Pero no se si se me está escapando algo.

Gracias y saludos
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20150603/8b11f2bd/attachment.html>


More information about the pyar mailing list