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