tornado 裡面如何使用Future中的數據?

tonado官方文檔(tornado.gen)

可以通過定義以下方法獲取非同步返回值:

@gen.coroutine
def fetch_json(url):
response = yield AsyncHTTPClient().fetch(url)
raise gen.Return(json_decode(response.body))

但是以下代碼調用fetch_json方法,得到一個數據(tornado.concurrent.Future),在get方法裡面怎麼獲取返回的response.body的值?

class TestHandler(BaseHtHandler):
@asynchronous
def get(self):
log.info("TestHandler.get")
self.set_header("Access-Control-Allow-Origin", "*")
response=self.fetch_json("http://www.baidu.com")
self.finish()


import tornado.ioloop
import tornado.web
from tornado import gen
from tornado.httpclient import AsyncHTTPClient

class MainHandler(tornado.web.RequestHandler):
@gen.coroutine
def get(self):
response = yield self.fetch_json("http://www.baidu.com")
self.write(response)

@gen.coroutine
def fetch_json(self, url):
response = yield AsyncHTTPClient().fetch(url)
raise gen.Return(response.body)

application = tornado.web.Application([
(r"/", MainHandler),
])

if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.current().start()


你需要用 `yield` 來調用 `fetch_json` ,當程序執行到 `yield` 語句時會跳轉到其他函數中繼續執行,而 `get` 函數就會掛起,直到 `Future` 觸發了 `set_result`。


json.loads(response.body)


推薦閱讀:

Django 的最佳開發實踐有哪些?
Tornado 非同步讀寫文件的方法?
python庫Django,Flask各有什麼用途?
Flask框架怎麼樣,比起Web.py有哪些不同?
用Python寫爬蟲,用什麼方式、框架比較好?

TAG:Tornado | Python框架 |