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

相关文章
相关标签/搜索