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