首页 > 学习tornado遇到一段代码 大神们帮我解释下

学习tornado遇到一段代码 大神们帮我解释下

import tornado.ioloop
from tornado.httpclient import AsyncHTTPClient
import functools

def fetch():
    response = yield functools.partial(AsyncHTTPClient().fetch, 'http://jinri.info')
    print response

gen = fetch()
f = gen.next()

def callback(response):
    try:
        gen.send(response)
    except StopIteration:
        pass


f(callback)
print 'here'

tornado.ioloop.IOLoop.instance().start()

  1. 为什么f(acllback)print 'here'之后执行
  2. tornado.ioloop.IOLoop.instance().start()这行代码的作用什么?
  3. 用debug看程序运行的流程,在执行了tornado.ioloop.IOLoop.instance().start()之后,response才有结果,然后执行callback()回调,这个执行顺序也不是特别明白

在学习异步调用 看这代码卡主了.... 麻烦大家帮我解答下


生成器协议提供一个 调用者和生成器之前的通讯方法,可以影响后面的操作, 生成器必须调用next 开始一个生成器


访问了之后产生了io阻塞, 就先打印了here 然后请求的内容返回。。 最后一行是启动ioloop 监听。


这段code的执行过程:

gen = fetch()    # 创建一个生成器函数
f = gen.next()   # 调用生成器函数,返回 yield 后面的函数,即经过partial包装的 AsyncHTTPClient。
                 # 可以理解返回AsyncHTTPClient函数。

f(callback)      # 执行f函数,也就是执行 AsyncHTTPClient,
                 # AsyncHTTPClient函数包含一个系统异步IO调用。AsyncHTTPClient注册了回调函数,
                 # 当异步IO完毕,调用回调callback。

print 'here'     # 打印 

                 # 注意 :callback是异步调用的回调,因此无法确定是在print之前还是之后执行。
                 # 通常而言,网络IO会比计算慢,因此绝大多数情况下先执行print,然后才调用callback,
                 # 注意是callback,不是f,f早就执行了。
                 # 执行callback的时候,通过生成器 gen.send(response),将结果返回给fetch的response。
                 # 也就是可以理解此时的 yield 等价于  response = return callback()

tornado.ioloop.IOLoop.instance().start()tornado开启网络listen的主循环

【热门文章】
【热门文章】