Tornado有兩種方式可改變同步的處理流程:
非同步化:針對RequestHandler的處理函數使用@tornado.web.asynchronous修飾器,將預設的同步機制改為異步機制。該方法已經過期。
協程化:針對RequestHandler的處理函數使用@tornado.gen.coroutine修飾器,將預設的同步機制改為協程機制。
1、非同步化
此方法已過期,不再贅述,直接使用@tornado.gen.coroutine取代。
2、協程化
Tornado協程結合了同步處理和非同步處理的有點,使得程式碼即清晰易懂,又能夠適應海量客戶端的高並發請求。
程式碼:
import tornado.web import tornado.httpclient from tornado.web import Application import tornado.ioloop 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.body) if __name__ == '__main__': app=Application([ ("/",MainHandler) ]) app.listen("8888") tornado.ioloop.IOLoop.current().start()
協程化的關鍵技術點如下:
用tornado.gen.coroutine裝飾MainHandler的get()、post ()等處理函數。
使用非同步物件處理耗時操作,例如本例的AsyncHTTPClient。
呼叫yield關鍵字取得非同步物件的處理結果。
以上是Python開發Tornado網站異步與協程化的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!