[pyar] Algunas dudas con Tornado

Claudio Freire klaussfreire en gmail.com
Mar Dic 30 17:15:52 ART 2014


2014-12-30 16:49 GMT-03:00 Luis Masuelli <luismasuelli en hotmail.com>:
> 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")


Nunca tenés que devolver un valor inmediato.

Si una rutina devuelve un Future, tiene que devolver siempre Future,
sino se vuelve una pesadilla invocarla.

La solución cuando ya conocés el valor que tiene que tener el future
al salir de la rutina, es devolver el future ya con el valor:

def hacerAlgoRapido():
   f = tornado.concurrent.Future()
   f.set_result(3)
   return f

Cuando lo que vas a hacer es pesado, si las librerías que vas a usar
no soportan ya trabajar con futures o con el I/O loop de Tornado, vas
a tener que usar un thread.

Pero no necesitás levantar un thread por cada tarea, podés usar un threadpool.

Si tenés concurrent (en python3 es de la stdlib, o en py2 lo podés
instalar), podés usar concurrent.futures.thread.ThreadPoolExecutor.

Entonces:

threadpool = concurrent.futures.thread.ThreadPoolExecutor(8)

def _hacerloPesado:
   # blabla
   return 10
def hacerAlgoPesado():
   return threadpool.submit(_hacerloPesado, 3, 4, 5)

Y listo.


More information about the pyar mailing list