为了尽量减少并发连接造成的开销,Tornado使用了一种单线程事件循环的方式.
这就意味着所有的应用代码都应该是异步非阻塞的, 因为在同一时间只有一个操作是有效的.
接下来,我们看一个列子NonBlocking
类的get方法是异步非阻塞的写法Blocking
类的get方法是同步阻塞的写法
1 | import time |
当我们访问了 non_blocking 接口时
因await asyncio.sleep(10)
是异步的,所以并不会造成阻塞
然而当我们访问 blocking 接口时
因tornado默认是单线程模式,所以造成了阻塞。
Tornado的异步原理: 单线程的torndo打开一个IO事件循环, 当碰到IO请求,把他扔到一个socket管理器,
所以,当发起一个网络IO请求,就不用挂起线程等待IO结果,这个单线程的事件继续循环,接受其他请求或者IO操作,如此循环。