1. 程式人生 > >tornado 非同步化以及協程化

tornado 非同步化以及協程化

非同步化:

import tornado.web
import tornado.ioloop
import tornado.httpclient

class MainHandler(tornado.web.RequestHandler):

    @tornado.web.asynchorous    #裝飾器定義get函式,get返回不需要等到訪問結束,但是也無法傳送response給客戶端,只有當指定函式中的finish函式被呼叫時證明response生成工作已經完成了!
    def get(self):
        http_client = tornado.httpclient.AsyncHTTPClient()
        http_client.fetch('http://www.baidu.com',callback=self.on_response)

    def on_response(self,response):
        
        self.write(response)
        self.finish()  #response生成

非同步化提高併發能力,但是程式碼顯得繁瑣

協程化:

import tornado.web
import tornado.httpclient
import tornado.ioloop
import tornado.gen

class MainHandler(tornado.web.RequestHandler):

    @tornado.gen.coroutine
    def get(self):
        http = tornado.httpclient.AsyncHTTPClient()
        response = yield http.fetch('http://www.baidu.com')
        self.write(response)

裝飾器gen.coroutine證明該函式是一個協程函式,只需用yield關鍵字呼叫其他阻塞函式即可,如fetch函式,不會阻塞協程的繼續執行實現併發,也可以通過執行緒池建立兩個執行緒實現併發!