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函数连续执行了。下面是同样的代码的执行结果,两种不同的结果应该是响应速度与网速造成的。

  

 

posted @ 2018-06-11 11:20  巴蜀秀才  阅读(137)  评论(0编辑  收藏  举报