在使用tornado的時候, 有的時候可能會用到gen這個工具, 這個工具主要是用來簡化異步代碼的, 能夠用同步的寫法來寫異步調用好比:html
1 class GenAsyncHandler(RequestHandler): 2 @gen.coroutine 3 def get(self): 4 http_client = AsyncHTTPClient() 5 response = yield http_client.fetch("http://example.com") 6 do_something_with_response(response) 7 self.render("template.html")
這裏面當運行到response那一行的時候就會把函數暫時掛起, 等fetch有結果以後會繼續執行異步
在一個函數中, 若是有yield那麼這個函數能夠被稱爲generator, 也就是一個生成器. 在如今的版本中, yield是一個表達式是有返回值的, 這個值能夠使用send函數來設置. 生成器能夠使用next和send繼續執行使用yield掛起的地方函數
好比下面這個函數:tornado
1 def yield_test1(): 2 print 1
3 r = yield "y1"
4 print 2, r 5
6 y1 = yield_test1() 7 y1.next()
這個執行結果會執行第一個print 1輸出1, 而且會返回"y1", 而後該函數會掛起, 此時能夠使用next也能夠使用send函數, next函數和send(None)是等價的.工具
若是在第二步使用send(value)的話, 那麼yield表達式的值會被設置成value, 即r等於value, 而後會繼續執行後面的print函數, 輸出2和r的值而且最後一次運行會拋出StopIteration的異常, 表示中斷generator, 也能夠本身throw一個GeneratorExit來中斷fetch