欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Tornado介绍

程序员文章站 2022-07-15 12:13:03
...

Tornado介绍
Tornado龙卷风是一个开源的网络服务器框架,它是基于社交聚合网站FriendFeed的实时信息服务开发而来的

  • Tornado是使用Python编写的Web服务器兼Web应用框架
  • 与主流Web服务器框架不同的是,Tornado是异步非阻塞式服务器,得益于非阻塞式和对epoll模型的运用
  • Tornado是实时Web服务的一个理想框架,它非常适合开发长轮询、WebSocket和需要与每个用户建立持久连接的应用

特点

  • 轻量级Web框架

  • 异步非阻塞IO处理方式

  • Tornado采用的单进程单线程异步IO的网络模式,其高性能源于Tornado基于Linux的Epoll(UNIX为kqueue)的异步网络IO

  • 出色的抗负载能力

  • 不依赖多进程或多线程

  • WSGI全栈替代产品
    WSGI把应用(Application)和服务器(Server)结合起来,Tornado既可以是WSGI应用也可以是WSGI服务

  • 既是WebServer也是WebFramework

Tornado是基于Bret Taylor和其他人员为FrientFeed所开发的网络服务框架,当FriendFeed被Facebook收购后得以开源。不同于那些最多只能达到1w并发连接的传统网络服务器。Tornado在设计之初就考虑到了性能因素,旨在解决C10K问题,这样的设计使其成为一个拥有高性能的框架

结构

  • Web框架
    主要包括RequestHandler用于创建Web应用程序和各种支持类的子类
  • HTTP服务器与客户端
    主要包括HTTPServer和AsyncHTTPClient
  • 异步网络库
    主要包括IOLoop和IOStream作为HTTP组件的构建块
  • 协程库
    Tornado的Web框架和HTTP服务器一起提供了完整的堆栈替代方案WSGI

Tornado实现异步原理

  1. 每个请求过来就会创建一个socket对象,并yield一个future对象,然后tornado就处理下一个连接了
  2. tornado内部会以socket对象为key,future对象为value加入字典
  3. tornado内部调用epoll方法监听这个全局字典,有socket对象变化就会执行future.set_result(’…’)
  4. 执行future.set_result(’…’)后就会将future.ready标志位变成True,然后就会调用callback方法返回内容

注1:yield 一个 Future对象,那么Tornado会等待,直到执行future.set_result(’…’)才会释放
 
注2:epoll实质是不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程

 
     
Tornado实现异步非阻塞举例

import tornado.ioloop
import tornado.web
from tornado import gen

class IndexHandler(tornado.web.RequestHandler):
    @gen.coroutine
    def get(self):
        self.write('I am index!!')

application = tornado.web.Application([
   (r"/index/", IndexHandler),
])

if __name__ == "__main__":
    print('http://127.0.0.1:8888/index/')
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

模块

Tornado是一个轻量级框架,它的模块不多最重要的模块是web,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网络应用的实现主要是TCPServer类

Integration With Other Services 系统集成服务

  • tornado.auth 使用OpenId和OAuth进行第三方登录
  • tornado.databaseMySQL服务端封装
  • tornado.platform.twisted在Tornado上运行Twisted实现的代码
  • tornado.websocket实现和浏览器的双向通信
  • tornado.wsgi其他Python网络框架或服务器的相互操作

Utilities 应用模块

  • tornado.autoload产生环境中自动检查代码更新
  • tornado.gen基于生成器的接口,使用该模块 保证代码异步运行
  • tornado.httputil分析HTTP请求内容
  • tornado.options解析终端参数
  • tornado.process多进程实现的封装
  • tornado.stack_context异步环境中对回调函数上下文保存、异常处理
  • tornado.testing单元测试

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

  • httpserver 服务于web模块的一个简单的HTTP服务器的实现

Tornado的HTTPConnection类用来处理HTTP请求,包括读取HTTP请求头、读取POST传递的数据,调用用户自定义的处理方法,以及把响应数据写给客户端的socket

  • iostream 对非阻塞式的socket的封装以便于常见读写操作

为了在处理请求时实现对socket的异步读写,Tornado实现了IOStream类用来处理socket的异步读写

  • ioloop 核心的I/O循环

Tornado为了实现高并发和高性能,使用了一个IOLoop事件循环来处理socket的读写事件,IOLoop事件循环是基于Linux的epoll模型,可以高效地响应网络事件,这是Tornado高效的基础保证

Tornado介绍

设计模型

Tornado不仅仅是一个Web框架,它完整地实现了HTTP服务器和客户端,再此基础上提供了Web服务,它可分为四层:

  • Web框架:最上层,包括处理器、模板、数据库连接、认证、本地化等Web框架所需功能

  • HTTP/HTTPS层:基于HTTP协议实现了HTTP服务器和客户端

  • TCP层:实现TCP服务器负责数据传输

  • Event层:最底层、处理IO事件
    Tornado介绍
    使用Tornado可以方便地架构出各种类型的web服务器,以HTTP服务器为例来分析下web服务器的工作方式
    Tornado介绍
    一个请求处理的处理过程

  • 服务器绑定bind到特定端口port,然后开始监听listen客户端的请求

  • 当客户端连接connect到来时,会将请求发送给服务器

  • 服务器处理请求完毕后返回响应结果给客户端

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

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

Tornado采用的方式是“多进程 + 非阻塞 + epoll模式”
Tornado介绍

相关标签: Tornado