tornado 非同步化以及協程化
阿新 • • 發佈:2018-11-14
非同步化:
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函式,不會阻塞協程的繼續執行實現併發,也可以通過執行緒池建立兩個執行緒實現併發!