1.訪問請求異步web
# 1.保證請求是異步的 class Test(tornado.web.RequestHandler): def get(self): self.write({'k1': 'v1'}) def post(self): self.write({'k1': 'v1'}) @gen.coroutine def doing(): # time.sleep(3) #同步的時候用的,異步不起做用 yield tornado.gen.sleep(10) raise tornado.gen.Return('你好') class Test1(tornado.web.RequestHandler): @gen.coroutine def get(self): res = yield doing() self.write(res) def post(self): self.write({'k2': 'v2'})
結果:數據庫
http://127.0.0.1:8000/test1/延遲10秒,http://127.0.0.1:8000/test/不受影響,正常訪問。併發
2.併發執行(場景:實時前段展現,實時插入數據庫)異步
@gen.coroutine def doing(): gen.sleep(2) raise gen.Return('年後') class Test1(tornado.web.RequestHandler): @gen.coroutine def get(self): start = time.time() #併發執行 res, res1 = yield [doing(), doing()] print(time.time() - start) self.write(res + res1) def post(self): self.write({'k2': 'v2'})
async def doing(): await gen.sleep(2) return '那你還能' class Test1(tornado.web.RequestHandler): async def get(self): start = time.time() #併發執行 res, res1 = await gen.convert_yielded([doing(), doing()]) print(time.time() - start) self.write(res + res1) def post(self): self.write({'k2': 'v2'})
await 關鍵字比 yield 關鍵字功能要少一些. 例如,在一個使用 yield 的協程中, 你能夠獲得Futures 列表, 你也可使用 tornado.gen.convert_yielded 來把任何使用 yield 工做的代碼轉換成使用 await 的形式.async
coroutine 是給Non-blocking 函數提供異步協程的方式運行,ide
3.線程池異步函數
from tornado.concurrent import run_on_executor from concurrent.futures import ThreadPoolExecutor class Test1(tornado.web.RequestHandler): executor = ThreadPoolExecutor() @gen.coroutine def get(self): start = time.time() res, res1 = yield [self.doing(), self.doing()] print(time.time() - start) self.write(res + res1) @run_on_executor def doing(self): time.sleep(2) return '22' def post(self): self.write({'k2': 'v2'})