一、介绍
这里直接引用原文:
Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. By using non-blocking network I/O, Tornado can scale to tens of thousands of open connections.
An asynchronous networking library (IOLoop and IOStream), which serve as the building blocks for the HTTP components and can also be used to implement other protocols.
对于几种网络IO模型的理解可以参考:
http://blog.csdn.net/historyasamirror/article/details/5778378
http://www.cnblogs.com/Anker/p/3254269.html
http://www.ibm.com/developerworks/cn/linux/l-async/
个人觉得前两篇阐述得比较准确,第三篇有些词容易产生异议,比如异步阻塞I/O说的其实就是IO multiplexing,而异步非阻塞I/O则是Asynchronous I/O,使用后面的术语不易混淆些。这里引用几句话:
同步IO与异步IO:是针对应用程序与内核的交互而言的。同步过程中进程触发IO操作并等待或者轮询的去查看IO操作是否完成。异步过程中进程触发IO操作以后,直接返回,做自己的事情,IO交给内核来处理,完成后内核通知进程IO完成。
阻塞IO与非阻塞IO:简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞。
这里有个比较容易疑惑的地方,这里的异步说进程触发IO操作后,直接返回,那么是否可以理解为异步IO一定是非阻塞IO呢?是这样的,这是四种不同的IO模型,它们有各自的定义和特点,不是包含非包含的关系。另外确定是否为异步,要看操作系统是否将用户数据主动的拷贝到用户(服务器)空间去供用户使用,而不是用户(服务器)主动监听。
我的理解:tornado基于epoll模型,属于IO multiplexing,并非异步IO模型,也不是非阻塞IO模型,事实上tornado里面说的asynchronous and non-blocking主要是针对函数和连接(socket)而言的:
An asynchronous function returns before it is finished.
In the context of Tornado we generally talk about blocking in the context of network I/O, although all kinds of blocking are to be minimized.
其实我们平常常说的同步异步并不一定是在说IO模型。
二、它如何工作
这里直接引用原文:
Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. By using non-blocking network I/O, Tornado can scale to tens of thousands of open connections.
An asynchronous networking library (IOLoop and IOStream), which serve as the building blocks for the HTTP components and can also be used to implement other protocols.
对于几种网络IO模型的理解可以参考:
http://blog.csdn.net/historyasamirror/article/details/5778378
http://www.cnblogs.com/Anker/p/3254269.html
http://www.ibm.com/developerworks/cn/linux/l-async/
个人觉得前两篇阐述得比较准确,第三篇有些词容易产生异议,比如异步阻塞I/O说的其实就是IO multiplexing,而异步非阻塞I/O则是Asynchronous I/O,使用后面的术语不易混淆些。这里引用几句话:
同步IO与异步IO:是针对应用程序与内核的交互而言的。同步过程中进程触发IO操作并等待或者轮询的去查看IO操作是否完成。异步过程中进程触发IO操作以后,直接返回,做自己的事情,IO交给内核来处理,完成后内核通知进程IO完成。
阻塞IO与非阻塞IO:简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞。
这里有个比较容易疑惑的地方,这里的异步说进程触发IO操作后,直接返回,那么是否可以理解为异步IO一定是非阻塞IO呢?是这样的,这是四种不同的IO模型,它们有各自的定义和特点,不是包含非包含的关系。另外确定是否为异步,要看操作系统是否将用户数据主动的拷贝到用户(服务器)空间去供用户使用,而不是用户(服务器)主动监听。
我的理解:tornado基于epoll模型,属于IO multiplexing,并非异步IO模型,也不是非阻塞IO模型,事实上tornado里面说的asynchronous and non-blocking主要是针对函数和连接(socket)而言的:
An asynchronous function returns before it is finished.
In the context of Tornado we generally talk about blocking in the context of network I/O, although all kinds of blocking are to be minimized.
其实我们平常常说的同步异步并不一定是在说IO模型。
二、它如何工作
我用的tornado版本为3.1.1,python版本为2.7.3,下面是一个简单的例子:
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.web import Application, RequestHandler, asynchronous
class MainHandler(RequestHandler):
@asynchronous
def get(self):
self.finish("Hello, world")
if __name__ == "__main__":
http_server = HTTPServer(Application([(r"/", MainHandler),]))
http_server.listen(8888)
IOLoop.instance().start()
这样一个高性能的web服