2016-01-13 13 views
5

Voglio usare il tornado con le librerie asyncio come cioutine aiohttp e nativo di Python 3.5, e sembra essere supportato nell'ultima versione di tornado (4.3). Tuttavia quando lo si utilizza nel ciclo di eventi del tornado, il gestore della richiesta si blocca indefinitamente. Quando non si utilizza aiohttp (ovvero senza le righe r = await aiohttp.get('http://google.com/') e text = await r.text() di seguito), il gestore richieste procede normalmente.Uso del tornado con aiohttp (o altre librerie basate su asyncio)

mio codice di prova è la seguente:

from tornado.ioloop import IOLoop 
import tornado.web 
import tornado.httpserver 
import aiohttp 

IOLoop.configure('tornado.platform.asyncio.AsyncIOLoop') 


class MainHandler(tornado.web.RequestHandler): 
    async def get(self): 
     r = await aiohttp.get('http://google.com/') 
     text = await r.text() 
     self.write("Hello, world, text is: {}".format(text)) 

if __name__ == "__main__": 
    app = tornado.web.Application([ 
     (r"/", MainHandler), 
    ]) 
    server = tornado.httpserver.HTTPServer(app) 
    server.bind(8888, '127.0.0.1') 
    server.start() 
    IOLoop.current().start() 

risposta

10

Secondo docs, si sta facendo quasi giusto. Devi creare/avviare ioloop di Tornado con asyncio corrispondente, dato che aiohttp è in esecuzione su asyncio.

from tornado.ioloop import IOLoop 
import tornado.web 
import tornado.httpserver 
import aiohttp 
from tornado.platform.asyncio import AsyncIOMainLoop 
import asyncio 

class MainHandler(tornado.web.RequestHandler): 
    async def get(self): 
     r = await aiohttp.get('http://google.com/') 
     text = await r.text() 
     self.write("Hello, world, text is: {}".format(text)) 

if __name__ == "__main__": 
    AsyncIOMainLoop().install() 
    app = tornado.web.Application([ 
     (r"/", MainHandler), 
    ]) 
    server = tornado.httpserver.HTTPServer(app) 
    server.bind(1234, '127.0.0.1') 
    server.start() 
    asyncio.get_event_loop().run_forever().start() 

Il motivo per cui il codice si blocca, è ioloop quel asyncio in realtà non è in esecuzione, uno solo del Tornado, così await è in attesa a tempo indeterminato.

Problemi correlati