[pyar] Algunas dudas con Tornado

Luis Masuelli luismasuelli en hotmail.com
Mar Dic 30 16:49:38 ART 2014


Wenas a todos :). Estoy aprendiendo a jugar con el Tornado un rato y quisiera ayuda con algo sobre las corrutinas.Digamos que tengo un chat simple:
import tornado.ioloop
import tornado.web
import tornado.websocket
import tornado.gen

clients = []


class IndexHandler(tornado.web.RequestHandler):

    @tornado.web.asynchronous
    def get(request):
        request.render("index.html")


class WebSocketChatHandler(tornado.websocket.WebSocketHandler):

    def open(self, *args):
        print("open", "WebSocketChatHandler")
        clients.append(self)

    def check_origin(self, origin):
        return True

    def on_message(self, message):
        for client in clients:
            client.write_message(message)

    def on_close(self):
        clients.remove(self)

app = tornado.web.Application([(r'/chat', WebSocketChatHandler), (r'/', IndexHandler)])

app.listen(8888)
tornado.ioloop.IOLoop.instance().start()


Y quiero ponerle que corra una tarea "algo pesada". En este sentido, el chat viene andando bien, pero quisiera hacer una tarea que haga cosas pesadas, digamos:
    @gen.corroutine
    def mirutina(message, arg1, arg2):
        print "preparandose..."
        a = (yield expresionQueDevuelveUnValorInmediato(arg1))
        b = (yield expresionQueDevuelveUnFuturo(arg2))
        print "valores: ", a, bMi pregunta es la siguiente: Asumamos que esta rutina la tengo declarada dentro de on_message: Como hago para lanzarla dentro del scheduler asincrono? Es decir: que no se ejecute dentro del ciclo de la petición sino como cosa aparte, "paralela".Lo que tengo entendido es que esta funcion, asi como la puse (es un caso de ejemplo, pero una funcion deberia poder hacer yield de las dos cosas - hasta donde tengo entendido, tornado wrappea esos valores con maybe_future para que siempre quede un Future, siendo el caso de una future ya resuelta para envolver valores que no sean Futures de antemano), debería schedulearse en tres pasos (inicio hasta primer yield; asignacion a "a" hasta segundo yield; asignacion a b hasta comando print). Lo que no se es como hacer para schedulear esa funcion dentro del ioloop (ya intenté usando).Digamos que ya intente lo siguiente pero recibo un BadYieldError cuando se trata de un valor inmediato:    tornado.ioloop.IOLoop.instance().spawn_callback(mirutina, mensaje, "foo")¿Como puedo hacer para que una funcion como la puse ande? 		 	   		  
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20141230/db9ff1ca/attachment.html>


More information about the pyar mailing list