Tornado

本文介绍了Tornado网络服务器框架,它基于FriendFeed实时信息服务开发,是轻量级框架,采用单进程单线程异步IO网络模式,能解决C10K问题。文中阐述了其特点、结构、模块、设计模型、工作方式,还介绍了安装和开发流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

理论知识

Tornado龙卷风是一个开源的网络服务器框架,它是基于社交聚合网站FriendFeed的实时信息服务开发而来的。
Tornado使用FriendFeed使用的可扩展的非阻塞Web服务器及其相关工具的开源版本,这个Web框架看起来有些像web.py或者Google的webapp,不过为了更加有效的利用非阻塞服务器环境,Tornado这个Web框架包含了一些相关的有用工具和优化。不同于那些最多只能达到1w并发连接的传统网络服务器。Tornado在设计之初就考虑到了性能因素,旨在解决C10K问题,这样的设计使其成为一个拥有高性能的框架。

特点

  • 轻量级Web框架
  • 异步非阻塞IO处理方式
    Tornado采用的单进程单线程异步IO的网络模式,其高性能源于Tornado基于Linux的Epoll(Unix为kqueue)的异步网络IO。
  • 出色的抗负载能力
  • 不依赖于多进程或多线程
  • WSGI全栈替代产品
    WSGI把应用(Application)和服务器(Serve)结合起来,Tornado既可以是WSGI应用也可以是WSGI服务。
  • 既是WebSever也是WebFramework

结构
Tornado的Web框架和HTTP服务器一起提供了完整的堆栈替代方案WSGI。

  • Web框架
    主要包括RequestHandler用于创建Web应用程序和各种支持类的子类。
  • HTTP服务器与客户端
    主要包括HTTPSever和AsyncHTTPClient
  • 异步网络库
    主要包括IOLoop和IOStream作为HTTP组件的构建块
  • 协程库

模块
Tornado是一个轻量级框架,web模块包含了Tornado大部分主要功能的Web框架,其他模块都是工具性质的,以便让Web模块更加有用。

  • Core Web Framework核心Web框架
    • tornado.web 包括Web框架大部分主要功能,包括RequestHandler和Application类。
    • tornado.httpserver 一个无阻塞HTTP服务器的实现
    • tornado.template模板系统
    • tornado.escape HTML、JSON、URLs等编解码和字符串操作
    • tornado.locale 国际化支持
  • Asynchronous Networking异步网络底层模块
    • tornado.ioloop 核心IO循环
    • tornado.iostream 对非阻塞的Socket的简单封装以方便常用的读写操作
    • tornado.httpclient 无阻塞的HTTP服务器实现
    • tornado.netutil 网络应用的实现主要是TCPSever类
  • Integration with Other Services系统集成服务
  • Utilities应用模块
    • tornado.autoload 产生环境中自动检查代码更新
    • tornado.gen 基于生成器的接口,使用该模块保证代码异步运行
    • tornado.httputil 分析HTTP请求内容
    • torando.options解析终端参数
    • tornado.process 多进程实现的封装
    • tornado.stack_context 异步环境中毒回调函数上下文保存、异常处理
    • tonado.testing 单元测试

Tornado服务器的三个底层核心模块

  • HTTPserver 服务于Web模块的一个简单的HTTP服务器的实现
  • iostream对非阻塞式的socket的封装以便于常见读写操作
    为了在处理请求时实现对socket的异步读写,Tornado实现了IOStream类用来处理socket的异步读写。
  • ioloop核心的I/O循环
    Tornado为了实现高并发和高性能,使用了一个IOLoop事件循环来处理socket的读写事件,IOLoop事件循环是基于Linux的epoll模型,可以高效的响应网络事件,这是Tornado高效的基础保证。
    在这里插入图片描述

设计模型
Tornado不仅仅是一个Web框架,它完整的实现了HTTP服务器和客户端,在此基础上提供了Web服务,它可分为四层:
在这里插入图片描述

  • Web框架:最上层,包括处理器、模板、数据库连接、认证、本地化等Web框架所需功能。
  • HTTP/HTTPS层:基于HTTP协议实现了HTTP服务器和客户端。
  • TCP层:实现TCP服务器负责数据传输。
  • Event层:最底层、处理I/O事件。

工作方式
使用Tornado可以方便的架构出各种类型的Web服务器,以HTTP服务器为例Web服务器的工作方式如下所示。
在这里插入图片描述
一个请求处理的处理过程:

  • 服务器绑定bind到特定端口port,然后开始监听listen客户端的请求。
  • 当客户端连接connect到来时,会将请求发送给服务器。
  • 服务器处理请求完毕后返回响应结果给客户端。

当处理成千上万的连接的时候,就会遇到典型的C10K问题,常见的解决方案有:

  • 一个线程服务多个客户端,使用非阻塞I/O和水平出发的就绪通知。
  • 一个线程服务多个客户端,使用非阻塞I/O和就绪改变时通知。
  • 一个服务线程服务于多个客户端,使用异步I/O。
  • 一个服务线程服务于一个客户端,使用阻塞I/O。
  • 将服务代码编译进内核。

Tornado采用的方式是“多进程+非阻塞+epoll模式”:
在这里插入图片描述

安装

pip3 install tornado

开发流程

首先创建Web应用程序Application,并将指定处理器Handler传递过去,然后开始监听指定端口,最后启动事件循环,并开始监听网络事件,主要是socket的读写操作。
创建脚本

#server.py
#导入Tornado模块
import tornado.ioloop #核心IO循环模块
import tornado.httpserver #异步非阻塞HTTP服务器模块
import tornado.web #Web框架模块
import tornado.options #解析终端参数模块

#从终端模块中导出define模块用于读取参数,导出options模块用于设置默认参数
from tornado.options import define, options

#定义端口用于指定HTTP服务监听的端口
#如果命令行中带有port同名参数则会称为全局tornado.options的属性,若没有则使用define定义
define('port', type=int, default=8000, help='run on the given port')

#创建请求处理器
#当处理请求时会进行实例化并调用HTTP请求对应的方法
class IndexHandler(tornado.web.RequestHandler):
    #定义get方法对应的HTTP的GET请求做出响应
    def get(self):
        #从querystring查询字符串中获取id参数的值,若无则默认为0.
        id = self.get_argument('id', 0)
        #write方法将字符串写入HTTP响应
        self.write('hello world id = ' + id)

#创建路由表
urls = [(r'/', IndexHandler),]

#创建服务器
def main():
    #解析命令行参数
    tornado.options.parse_command_line()
    #创建应用实例
    app = tornado.web.Application(urls)
    #监听端口
    app.listen(options.port)
    #创建IOLoopp 实例并启动
    tornado.ioloop.IOLoop.current().start()

#应用程序入口,解析命令行参数
if __name__ == '__main__':
    #启动服务器
    main()

运行测试
在这里插入图片描述
在这里插入图片描述
参考资料

Tornado

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值