2016-01-13 41 views
5

Kasırgaları aiohttp ve native python 3.5 coroutines gibi asyncio kütüphaneleriyle kullanmak istiyorum ve en son kasırga sürümünde destekleniyor gibi görünüyor (4.3). Ancak, kasırga olay döngüsünde kullanıldığında istek işleyicisi süresiz olarak askıda kalıyor. Aiohttp kullanılmadığında (yani r = await aiohttp.get('http://google.com/') ve text = await r.text() satırları olmadan), istek işleyicisi normal olarak devam eder.Kasırga kullanarak aiohttp (veya diğer asyncio tabanlı kitaplıklar)

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() 

cevap

10

docs göre, neredeyse doğru yapıyoruz şu şekildedir:

Testim kodudur. Aiohttp asyncio'da çalıştığı için/init Tornado'nun ioloop'unu karşılık gelen asyncio ile oluşturmalısınız.

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() 

kodunuzu takılıp sebebi, o asyncio en ioloop aslında çok await süresiz bekliyor, sadece Tornado'nun birini çalışmıyor olmasıdır.