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的客户端和服务器端
实现 (HTTPServer
和 AsyncHTTPClient
)
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 包含类的异步网络库 IOLoop
和 IOStream
作为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