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()
- 为什么
f(acllback)
在print 'here'
之后执行 -
tornado.ioloop.IOLoop.instance().start()
这行代码的作用什么? - 用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
的主循环