tornado如何進行非同步交互?
tornado.web.asynchronous和tornado.gen.engine這兩個裝飾器到底怎麼用,能不能舉兩個簡單點的例子。。。新手感激不盡。原理懂了,用法不會。感覺tornado的資料還是太少了啊。有限的資料都是大神寫的,新手表示看不懂。。。
謝邀,覺得官方的例子(tornado.gen a€」 Simplify asynchronous code)已經很清楚了 。
asynchronous 這個裝飾器用於 callback 風格的非同步函數,它告訴被裝飾的函數:執行完後別著急走,還有一個任務等你完成。在這個例子中:class AsyncHandler(RequestHandler):
@asynchronous
def get(self):
http_client = AsyncHTTPClient()
http_client.fetch("http://example.com",
callback=self.on_fetch)
def on_fetch(self, response):
do_something_with_response(response)
self.render("template.html")
如果沒有asynchronous 這個裝飾器,當 get 執行完時自動會調用 self.finish 方法,結束當次請求,而用了這個裝飾器後,get 返回時放棄調用 self.finish,而由你的回調函數決定什麼時候調用,
上面的 self.render 就會調用 self.finish。gen.engine 現在已經被 gen.coroutine 取代,適用於 generator 風格的非同步函數,被它封裝的函數必須是一個 generator。下面這個例子:class GenAsyncHandler(RequestHandler):
@gen.coroutine
def get(self):
http_client = AsyncHTTPClient()
response = yield http_client.fetch("http://example.com")
do_something_with_response(response)
self.render("template.html")
當執行到 yield時,暫時讓出 cpu 回到 ioloop,同時在 ioloop上註冊事件,當 非同步的操作執行完返回時再由 ioloop調度回來繼續執行後面。
無論是用 asynchronous 還是 gen.engine 這個裝飾器,關鍵的是 callback 和 yield 時使用的庫必須是非同步的,否則操作阻塞起不到非同步效果,這兩個例子使用的AsyncHTTPClient就是官方提供的非同步庫。 tornado的非同步庫要基於它的 ioloop來實現,可惜的是這方面的非同步庫並不多。推薦閱讀:
※網頁設計思路:如何快速完成扁平化中秋節網頁專題製作(理論篇)
※我們翻譯的這本書,可能是下一個設計趨勢
※把網站外包給第三方公司做需要注意些什麼?
※是果仁太聰明,還是中文網站太複雜? 【UXRen譯#146】
※人人網,微博等網站在分享url的時候都會轉換成短鏈接,這樣有什麼好處?