目录
一、Tornado 是什么
当你在知乎上浏览各种精彩问答,刷着热门话题时,有没有想过背后的技术支撑?其实,知乎的后端服务器就大量运用了 Tornado 框架 。当你打开网页版知乎,使用浏览器开发者工具查看 Network 中的请求,会发现一个状态码为 101 的特殊请求,这是浏览器通过 websocket 技术与后端服务器建立长连接,用于接收服务器主动推送的通知消息,而这里的后端服务器正是基于 Tornado 搭建。
Tornado 是一个 Python 编写的强大且可扩展的 Web 服务器框架,最初由 FriendFeed 开发,在 2009 年 FriendFeed 被 Facebook 收购后,T
ornao 被开源出来,从此在 Python 社区大放异彩。除了知乎,还有很多知名公司在生产环境中使用 Tornado,像 Quora、Turntable.fm、Bit.ly 及 MyYearbook 等。
Tornado 可不只是一个普通的 Web 框架,它具备很多强大的功能。它能提供高效的非阻塞式 HTTP 服务器,每秒可以处理数以千计的连接,这都得益于其非阻塞的方式和对 epoll(在 Linux 上)或 kqueue(在 BSD 和 Mac OS X 上)的运用;它有着完备的 Web 框架功能,包括 URL 路由映射、Request 上下文、基于模板引擎的页面渲染技术等,这些都是开发 Web 应用必不可少的工具;它提供了异步 I/O 支持、超时时间处理的高效网络库,使其不仅能用于 Web 开发,还能用于爬虫应用、物联网网关、游戏服务器等后台应用开发;它还内置了对 WebSocket 的完备支持,WebSocket 是 HTML5 的一种新标准,实现了浏览器和服务器之间的双向实时通信,使得 Tornado 在实时 Web 服务开发领域占据重要地位。
二、Tornado 的优势
(一)高性能
Tornado 高性能的关键在于其非阻塞 I/O 机制 。传统的 Web 框架在处理 I/O 操作(如读取数据库、发送网络请求)时,线程会被阻塞,直到操作完成,这期间线程无法处理其他请求。而 Tornado 采用非阻塞 I/O,当遇到 I/O 操作时,线程不会被阻塞,而是去处理其他请求,大大提高了并发处理能力。
在 Linux 系统中,Tornado 通过 epoll 来实现高效的 I/O 多路复用。epoll 是 Linux 内核提供的一种 I/O 事件通知机制,它可以同时监控多个文件描述符(如 socket),当有事件发生时,epoll 会迅速通知应用程序,避免了传统 select/poll 方法的低效轮询。假设你开发一个实时聊天应用,有大量用户同时在线发送消息,使用 Tornado 的非阻塞 I/O 和 epoll 机制,服务器就能轻松处理这些并发连接,确保消息能够及时送达。
与其他 Python Web 框架如 Django 和 Flask 相比,Tornado 的性能优势显著。在一个处理大量并发请求的场景中,Django 和 Flask 由于采用同步阻塞 I/O,随着并发量的增加,响应时间会迅速变长,甚至出现请求超时的情况;而 Tornado 凭借其非阻塞 I/O 和对 epoll 的运用,能保持较低的响应时间和较高的吞吐量,轻松应对高并发场景。
(二)轻量级
Tornado 的架构设计非常简洁,没有过多复杂的依赖和内置功能,这使得它非常轻量级 。与 Django 相比,Django 是一个功能强大的 “大而全” 框架,内置了丰富的功能,如数据库管理、用户认证、表单处理、后台管理等,这使得 Django 项目在开发时可以快速上手,但同时也带来了较高的复杂性和资源占用。
而 Tornado 则专注于提供核心的 Web 框架功能和高性能的异步 I/O 支持,开发者可以根据项目需求自由选择和集成第三方库。例如,在选择数据库访问库时,Tornado 没有强制要求使用特定的库,开发者可以根据项目需求选择 Tornado - MySQL、SQLAlchemy 等。这种轻量级的设计使得 Tornado 在开发小型项目或对性能和资源占用要求较高的项目时,具有很大的优势,能够减少开发的复杂性,提高开发效率,同时降低服务器的资源消耗。
(三)异步编程支持
异步编程是一种允许程序在执行 I/O 操作时不阻塞主线程的编程模式,它能显著提升程序在处理大量 I/O 操作时的执行效率 。在传统的同步编程中,当一个函数执行 I/O 操作(如读取文件、网络请求)时,线程会被阻塞,直到 I/O 操作完成,这期间线程无法执行其他任务。而异步编程中,当遇到 I/O 操作时,函数会立即返回,主线程可以继续执行其他任务,当 I/O 操作完成后,通过回调函数、Future 对象或协程等方式通知程序继续处理后续逻辑。
Tornado 对异步编程提供了强大的支持。在 Tornado 中,可以使用 @gen.coroutine 装饰器和 yield 关键字来定义异步函数。例如,在处理一个 HTTP 请求时,如果需要获取其他服务器的数据,使用异步编程可以这样实现:
from tornado import gen
from tornado.httpclient import AsyncHTTPClient
@gen.coroutine
def fetch_data():
http_client = AsyncHTTPClient()
response = yield http_client.fetch("http://example.com/data")
data = response.body
raise gen.Return(data)
在这个例子中,fetch方法是一个异步操作,yield关键字会暂停fetch_data函数的执行,直到fetch操作完成,期间 Tornado 的 I/O 循环可以处理其他请求。当fetch操作完成后,fetch_data函数会继续执行,获取响应数据并返回。这种异步机制使得 Tornado 在处理高并发的 I/O 密集型任务时,能够充分利用系统资源,提高程序的整体性能。
三、环境搭建
在开始使用 Tornado 进行 Web 开发之前,需要先搭建好开发环境,主要包括安装 Python 和 Tornado 框架。
(一)安装 Python
Tornado 是基于 Python 开发的,所以首先需要安装 Python。Python 官方网站提供了不同操作系统下的安装包,你可以根据自己的操作系统选择对应的版本进行下载。
- Windows 系统:
-
- 下载完成后,双击安装包开始安装。在安装向导界面,务必勾选 “Add Python to PATH” 选项,这样可以自动将 Python 添加到系统环境变量中,方便后续在命令行中使用 Python 命令。如果没有勾选该选项,也可以在安装完成后手动配置环境变量,具体步骤为:右键点击 “此电脑”,选择 “属性”,在弹出的窗口中点击 “高级系统设置”,然后点击 “环境变量” 按钮,在 “系统变量” 中找到 “Path” 变量,点击 “编辑”,在弹出的编辑环境变量窗口中点击 “新建”,将 Python 的安装路径(例如 C:\Python310)和 Python 安装路径下的 Scripts 文件夹路径(例如 C:\Python310\Scripts)添加进去,点击 “确定” 保存设置。
-
- 点击 “Install Now” 进行默认安装,或者点击 “Customize installation” 进行自定义安装,如选择安装路径等。安装过程可能需要一些时间,请耐心等待。
-
- 安装完成后,打开命令提示符(CMD),输入 “python” 命令,如果出现 Python 的交互式解释器界面,显示 Python 的版本信息,并且光标变为 “>>>”,则说明 Python 安装成功。也可以输入 “python -V”(注意是大写的 V)来查看 Python 的版本号。