Tornado 诞生于 FriendFeed,这是一家由前 Google 员工创建的社交网络聚合服务公司。这家公司在 2009 年被 Facebook 收购之后,Tornado 就被用于支撑其庞大的实时更新服务。也正是在那个时候,Tornado 被开源,自此成为 Python 社区中的一个重量级成员。
Tornado 之所以出来,主要是因为当时的 Python 网络框架并不能满足 FriendFeed 高并发、实时通信的需求。这是因为,传统的网络服务模型通常是阻塞性的,即打开一个网络连接,然后等待并获取响应,再关闭连接。但对于长连接或者需要实时交互的服务来说,这样的模型效率很低,因为它在等待响应的时候服务器不能处理其他的连接。
这就是 Tornado 要解决的问题。Tornado 提供了一种非阻塞性的网络 I/O 模型,可以同时处理大量的开放连接。这种模型非常适合实时服务,比如 WebSockets,因为这种服务需要长期打开连接,以便在用户之间传输实时的更新。
Tornado 并不是一种传统意义上的 Web 开发框架,例如 Django 或 Flask,尽管它提供了一些类似的工具,如请求处理、模板、安全性和用户身份验证,但是它的主要力量在于与众不同的网络 I/O 模型。
接下来,我们将进一步探讨 Tornado 的这些特性以及它们如何使 Tornado 成为一个强大的网络框架:
Tornado 有一个自带的、高效的 HTTP 服务器,它使用非阻塞性的网络 I/O,可以处理大量的并发连接。这个服务器是通过 epoll(在 Linux 上)或 kqueue(在 BSD 和 Mac OS X 上)来实现的,这些是操作系统提供的高级 I/O 接口,可以高效地处理数以万计的并发连接。
Tornado 提供了基于生成器的异步接口,以便创建非阻塞性的应用。它使用了 Python 的 yield
语句来暂停和恢复函数的执行,这使得你能在看似顺序执行的代码中进行 IO 操作,而不阻塞整个应用。
虽然 Tornado 的主要焦点是其非阻塞性的网络服务,但它也提供了一些基本的 Web 开发工具。这包括:
以上就是 Tornado 的基本介绍,接下来的文章我们将进一步详细探讨 Tornado 的高级特性和应用场景。
不同版本的tornado对于python版本也有要求,注意安装时选择好版本哟
pip install tornado
简单应用示例
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(18888)
tornado.ioloop.IOLoop.current().start()
这个程序做的事情如下:
它定义了一个名叫 MainHandler 的请求处理器类,当一个 GET 请求到达,这个处理器会响应 “Hello, world”。
make_app 函数创建一个 tornado.web.Application 的实例,该实例包含了应用的路由信息,将根 URL 映射到了我们定义的处理器 MainHandler。
在if __name__ == "__main__"
条件下的代码会在这个脚本作为主程序运行时执行。它首先会创建并启动一个应用,然后启动 Tornado 的 I/O 循环。
要启动这个应用,你需要打开一个终端,导航到包含你的 python 文件的目录,然后执行 python main.py。然后,在你的 Web 浏览器中打开 http://localhost:8888,你应该会看到 “Hello, world” 这样的欢迎信息。