一、Tornado 框架简介

1.1 什么是 Tornado

Tornado 是一款基于 Python 的异步非阻塞、高并发 Web 框架,由 FriendFeed 开发、后被 Facebook 开源,专为高并发长连接场景设计。和 Django、Flask 等同步框架不同,Tornado 依托 IOLoop 事件循环 实现单线程高并发,性能极强,擅长处理海量长连接、实时请求场景。

1.2 核心特点

  • 异步非阻塞:基于 epoll/kqueue 事件驱动模型,支持超高并发

  • 原生支持长连接:完美适配 WebSocket、实时推送、IM 聊天场景

  • 轻量简洁:无冗余组件,架构简单,学习成本低

  • 自带异步库:内置 IOLoop、IOStream、协程工具,无需额外依赖

  • 兼容同步写法:支持同步、异步两种编码模式,适配新旧业务

1.3 适用场景

  • 高并发接口服务、秒杀、流量网关

  • 实时 Web 服务、WebSocket 长连接、消息推送

  • 中小型轻量化 Web 项目、内部工具服务

1.4 和其他框架区别

  • Django:大而全、同步阻塞、适合传统业务后台

  • Flask:轻量同步、灵活扩展,并发能力弱

  • FastAPI:现代异步、语法简洁、自动文档

  • Tornado:老牌成熟异步、长连接最强、生产稳定性极高

二、环境搭建

2.1 安装 Tornado

支持 Python3.7+ 所有版本,执行安装命令:

pip install tornado

2.2 验证安装

python -c "import tornado;print(tornado.version)"

输出版本号即安装成功。

三、第一个 Tornado 程序(HelloWorld)

搭建最简 Web 服务,理解 Tornado 核心运行流程

# main.py
import tornado.ioloop
import tornado.web

# 路由处理类
class MainHandler(tornado.web.RequestHandler):
    # 处理GET请求
    def get(self):
        self.write("Hello Tornado!高并发Web框架")

# 初始化应用
def make_app():
    return tornado.web.Application([
        (r"/", MainHandler)  # 路由映射:地址 -> 处理类
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8000)  # 监听8000端口
    print("服务启动成功:http://127.0.0.1:8000")
    tornado.ioloop.IOLoop.current().start()  # 启动事件循环

运行项目

python main.py

访问 http://127\.0\.0\.1:8000 即可看到页面内容。

3.1 核心执行流程

  1. 定义 RequestHandler 子类:处理具体请求

  2. Application 注册路由规则

  3. 监听端口,绑定服务

  4. 启动 IOLoop 事件循环,持续监听请求

四、基础路由与请求处理

4.1 多路由配置

支持多接口路由、动态路由参数,适配常规接口开发

import tornado.ioloop
import tornado.web

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("首页页面")

class UserHandler(tornado.web.RequestHandler):
    # 动态路由参数:user_id
    def get(self, user_id):
        self.write(f"用户ID:{user_id}")

def make_app():
    return tornado.web.Application([
        (r"/", IndexHandler),
        (r"/user/(\d+)", UserHandler)  # 正则匹配动态参数
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8000)
    tornado.ioloop.IOLoop.current().start()

访问 http://127\.0\.0\.1:8000/user/1001 可获取动态参数。

4.2 常用请求方法

重写类方法支持 GET、POST、PUT、DELETE 请求

class TestHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("GET 请求")

    def post(self):
        self.write("POST 请求")

    def put(self):
        self.write("PUT 请求")

    def delete(self):
        self.write("DELETE 请求")

4.3 获取请求参数

class ParamHandler(tornado.web.RequestHandler):
    def get(self):
        # 获取GET参数,设置默认值
        name = self.get_argument("name", "默认名称")
        age = self.get_argument("age", 18)
        self.write(f"姓名:{name},年龄:{age}")

    def post(self):
        # 获取POST表单参数
        username = self.get_body_argument("username")
        password = self.get_body_argument("password")
        self.write(f"账号:{username},密码:{password}")

五、异步编程核心(Tornado 重点)

Tornado 高性能的核心是异步协程,彻底解决同步阻塞问题。

5.1 同步阻塞问题

普通同步代码遇到耗时操作(数据库、网络请求)会阻塞整个服务,无法处理新请求。

5.2 异步协程写法

使用 async/await 实现异步非阻塞,Tornado 原生支持

import tornado.ioloop
import tornado.web
import asyncio

class AsyncHandler(tornado.web.RequestHandler):
    # 异步请求处理
    async def get(self):
        # 模拟耗时异步操作,不阻塞服务
        await asyncio.sleep(2)
        self.write("异步请求处理完成,无阻塞!")

def make_app():
    return tornado.web.Application([
        (r"/async", AsyncHandler)
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8000)
    tornado.ioloop.IOLoop.current().start()

多个请求同时访问,不会互相阻塞,并发能力大幅提升。

六、模板渲染与静态文件

Tornado 自带模板引擎,支持模板继承、变量渲染、循环判断,无需额外前端框架。

6.1 项目目录

tornado-demo/
├── main.py
├── static/        # 静态文件目录(css/js/img)
└── templates/     # 模板文件目录
    └── index.html

6.2 配置模板与静态路径

import tornado.ioloop
import tornado.web
import os

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        # 传递变量到模板
        data = {
            "title": "Tornado模板页面",
            "name": "测试用户",
            "list_data": [1,2,3,4]
        }
        self.render("index.html", **data)  # 渲染模板

def make_app():
    # 配置模板、静态文件路径
    return tornado.web.Application(
        [
            (r"/", IndexHandler)
        ],
        template_path=os.path.join(os.getcwd(), "templates"),  # 模板目录
        static_path=os.path.join(os.getcwd(), "static"),      # 静态文件目录
        debug=True  # 调试模式,修改代码自动重启
    )

if __name__ == "__main__":
    app = make_app()
    app.listen(8000)
    tornado.ioloop.IOLoop.current().start()

6.3 模板文件(templates/index.html)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
    <h1>欢迎 {{ name }}</h1>
    <!-- 循环遍历 -->
    <ul>
        {% for item in list_data %}
        <li>{{ item }}</li>
        {% end %}
    </ul>
    <!-- 条件判断 -->
    {% if name == "测试用户" %}
    <p>当前为测试账号</p>
    {% end %}
</body>
</html>

七、JSON 接口开发(常用)

前后端分离开发中,直接返回 JSON 数据,适配前端接口请求

import tornado.ioloop
import tornado.web
import json

class JsonHandler(tornado.web.RequestHandler):
    def set_default_headers(self):
        # 设置跨域和响应头
        self.set_header("Content-Type", "application/json; charset=utf-8")
        self.set_header("Access-Control-Allow-Origin", "*")

    def get(self):
        res = {
            "code": 200,
            "msg": "请求成功",
            "data": {
                "name": "Tornado",
                "version": "6.4.1"
            }
        }
        self.write(json.dumps(res, ensure_ascii=False))

def make_app():
    return tornado.web.Application([
        (r"/api/data", JsonHandler)
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8000)
    tornado.ioloop.IOLoop.current().start()

八、WebSocket 实时通信(Tornado 王牌功能)

Tornado 原生完美支持 WebSocket,是 Python 框架中长连接最优方案,适合聊天、推送、实时监控。

import tornado.ioloop
import tornado.web
import tornado.websocket

# 存储在线连接
online_clients = set()

# WebSocket处理类
class WebSocketHandler(tornado.websocket.WebSocketHandler):
    # 建立连接
    def open(self):
        online_clients.add(self)
        print("客户端连接成功")

    # 接收客户端消息
    def on_message(self, message):
        print(f"收到消息:{message}")
        # 广播消息给所有在线客户端
        for client in online_clients:
            client.write_message(f"服务端收到:{message}")

    # 连接关闭
    def on_close(self):
        online_clients.remove(self)
        print("客户端断开连接")

def make_app():
    return tornado.web.Application([
        (r"/ws", WebSocketHandler)
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8000)
    print("WebSocket服务启动:ws://127.0.0.1:8000/ws")
    tornado.ioloop.IOLoop.current().start()

九、项目分层规范(企业级)

小型项目可单文件运行,正式项目推荐分层结构,易维护、可扩展

tornado-project/
├── main.py             # 项目入口
├── config.py           # 配置文件
├── static/             # 静态资源
├── templates/          # 模板文件
├── api/                # 接口层
│   ├── __init__.py
│   └── user.py         # 用户相关接口
└── utils/              # 工具类
    └── response.py     # 统一返回格式

十、常见问题与注意事项

  • 异步禁忌:异步接口中禁止使用 time.sleep、同步数据库请求等阻塞代码,会直接拖垮并发性能

  • 调试模式:debug=True 仅用于开发环境,生产环境必须关闭

  • 跨域问题:前后端分离项目需手动配置跨域响应头

  • 长连接优势:高并发、WebSocket 场景优先选 Tornado,普通 CRUD 业务可按需选择 FastAPI

  • 端口占用:启动前检查端口是否被占用,修改监听端口即可解决

十一、学习进阶方向

  1. Tornado + MySQL/Redis 数据库异步操作

  2. WebSocket 多人聊天室、消息推送实战

  3. 全局异常处理、日志封装、统一接口返回

  4. 多进程部署、Nginx 反向代理上线

  5. 结合协程实现高并发爬虫、接口网关

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐