Tornado相关概念

Tornado 6.0需要python 3.5.2+

基本概念

Tornado 是一个用Python语言写成的Web服务器兼Web应用框架,由FriendFeed公司在自己的网站FriendFeed中使用,被Facebook收购以后框架以开源软件形式开放给大众

特点

作为Web框架,是一个轻量级的Web框架,类似于另一个Python web 框架Web.py,其拥有异步非阻塞IO的处理方式

作为Web服务器,Tornado有较为出色的抗负载能力,官方用nginx反向代理的方式部署Tornado和其它Python web应用框架进行对比,结果最大浏览量超过第二名近40%

处理器为 AMD Opteron, 主频2.4GHz, 4核
服务 部署 请求/每秒
Tornado nginx, 4进程 8213
Tornado 1个单线程进程 3353
Django Apache/mod_wsgi 2223
web.py 1个单线程进程 2066
CherryPy 独立 785

优势

轻量级web框架
异步非阻塞IO处理方式
出色的抗负载能力
优异的处理性能,不依赖多进程/多线程,一定程度上解决C10K问题
WSGI全栈替代产品,推荐同时使用其web框架和HTTP服务器

Tornado处理一个网络请求的逻辑


# coding: utf-8
# Tornado处理一个网络请求的逻辑

import tornado.ioloop
import tornado.web


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        # 处理HTTP GET请求
        self.write("hi!")



def make_app():
    # todo 声明一个tornado的application,里面就规定了服务器接收处理的url路径。
    return tornado.web.Application(
        [
            (r"/", MainHandler),
        ]
    )

if __name__ == '__main__':
    app = make_app()
    app.listen(8888)
    print("starting--")
    tornado.ioloop.IOLoop.current().start()

基本结构

Tornado 大致可分为四个主要部分:

1 Web框架(包括 RequestHandler 它是创建Web应用程序和各种支持类的子类)。

> `RequestHandler`:封装对请求处理的所有信息和处理方法


> `get/post/..`:封装对应的请求方式


> `write()`:封装响应信息,写响应信息的一个方法

2 HTTP的客户端和服务器端实现 (HTTPServerAsyncHTTPClient

tornado.httpserver.HTTPServer(app)
httpserver.listen(port)

tornado.httpserver.HTTPServer(app)
httpserver.bind(port)
httpserver.start(0/None/<0/num)
# coding: utf-8
#

from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoop
from tornado.httpserver import HTTPServer

class IndexHandler(RequestHandler):
    def get(self):
        self.write("index")


if __name__ == '__main__':
    app = Application(
        [
            (r"/", IndexHandler)
        ]
    )

    http_server = HTTPServer(app)
    http_server.bind(8888)

    http_server.start(1)

    IOLoop.current().start()

3 包含类的异步网络库 IOLoopIOStream 作为HTTP组件的构建块,也可以用于实现其他协议。

核心io循环模块,封装linux的epoll和BSD的kqueue , tornado高性能处理的核心

    > `current()`: 返回当前线程的IOLoop实例对象
    
    
    > `start()` : 启动IOLoop实力对象的IO循环,开启监听

4 协作程序库 (tornado.gen )它允许异步代码以比链接回调更简单的方式写入。

这类似于Python3.5中引入的本地协同工作特性( async 和 await)。 async def建议使用本地协程来代替 tornado.gen 模块可用时。


# Decorated:                    # Native:

# Normal function declaration
# with decorator                # "async def" keywords
@gen.coroutine
def a():                        async def a():
    # "yield" all async funcs       # "await" all async funcs
    b = yield c()                   b = await c()
    # "return" and "yield"
    # cannot be mixed in
    # Python 2, so raise a
    # special exception.            # Return normally
    raise gen.Return(b)             return b

more » tornado

Buy me a 肥仔水!