tornado ------ 协程
代码演示:
1 from tornado import gen # 引入协程库 2 from tornado.httpclient import AsyncHTTPClient 3 from tornado.ioloop import IOLoop 4 5 6 @gen.coroutine 7 def coroutine_visit(): 8 http_client = AsyncHTTPClient() 9 response = yield http_client.fetch("https://www.baidu.com") 10 print(response.body) 11 12 13 @gen.coroutine 14 def outer_coroutine(): 15 print("outer_coroutine:开始第二个协程...") 16 yield coroutine_visit() 17 print("end of outer_coroutine") 18 19 20 def func_normal(): 21 print("func_normal:开始调用一个协程...") 22 IOLoop.current().run_sync(lambda: coroutine_visit()) 23 print("func_normal:end of calling a coroutine") 24 25 26 def func_running(): 27 print("func_running:开始调用一个协程...") 28 IOLoop.current().spawn_callback(coroutine_visit) 29 print("func_running:end of calling a coroutine")
代码调用:
1 outer_coroutine() 2 func_normal()
结果:
@gen.coroutine 修饰器,声明这是一个协程函数。outer_coroutine 是不会阻塞的,而func_normal会阻塞,所以上面返回两个
结果。
调用代码:
1 outer_coroutine() 2 func_normal() # func_normal函数会阻塞,直到请求网页成功,函数执行完成 3 func_running()
执行结果:
run_sync()函数会阻塞当前函数的执行,直到呗调用的协程执行完成。spawn_callback()不会等待被调用协程执行完成,所以
print函数连续执行了。下面是同样的代码的执行结果,两种不同的结果应该是响应速度与网速造成的。
清澈的爱,只为中国