yield的筆記

在使用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

相關文章
相關標籤/搜索