yield的笔记

在使用tornado的时候, 有的时候可能会用到gen这个工具, 这个工具主要是用来简化异步代码的, 可以用同步的写法来写异步调用比如:

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挂起的地方

比如下面这个函数:

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来中断

 

posted on 2013-06-19 21:42  nobutawoproduce  阅读(185)  评论(0)    收藏  举报