Tornado概念
Tornado主要为减少并发连接产生的开销(传统一个连接起一个线程,如Django,但单台服务器并处理不了太高的并发,集群又耗资金),而tornado利用线程进行循环响应,因此,所有代码必须是异步和非阻塞的,不能阻塞等待,太耗时,并且长连接保持
异步:非顺序执行,不需要等待返回,结束之前就可走,等待调用即可。异步函数在函数运行结束前便返回,而且通常会在程序中触发一些动作然后在后台执行一些任务。主要的一个实例就是按钮button,我们可以发现在html页面中button代码可能会写在其他程序前,但并不用先执行button,再执行后面的代码,而是后面代码先执行,button只是绑定了一个回调,当点击时,回调启动。Tornado利用协程编写异步代码,关键字yield替代链式回调实现挂起和继续程序执行
非阻塞io:属于同步IO,系统调用,发现没有数据,离开做自己的事情,过一阵再来,不同干等
长连接:一般来说一次http请求需要建立一次tcp连接,比较费时,因此利用长连接保持,在http的header里可看到Connection:keep-alive
轻量级,少而精,性能优越
安装
pip install tornado
tornado的基本模块
- tornado.web
- tornado.ioloop
- tornado.httpserver
- tornado.options
tornado.web
- RequestHandler
封装了对应一个请求的所有信息和方法,get,post等
- Application
Tornado web框架的核心应用类,与服务器对接,保存了路由信息表,将接受到的客户端请求通过web应用中的路由映射表引导到相应的handler中,也就是响应类
tornado.ioloop
封装了epoll和kqueue,tornado高性能的基石
- IOLoop.current() 返回当前线程的实例
- IOLoop.start() 启动IOLoop实例的I/O循环,服务器监听打开
tornado.httpserver
tornado的服务器,服务于我们建立的应用
tornado.options
tornado.options.define(),定义options选项变量,定义的变量可在全局的tornado.options.options中获取使用
- name 选项变量名,唯一
- default name的默认值,不传为NONE
- type name的类型
- multiple name的值是否可以多个,布尔类型,默认为False,若为True,那么设置选项变量时值与值之间用英文逗号分隔,而选项变量则是一个list列表
- help name帮助提示信息
tornado.options.options
全局的options对象,所有定义的选项变量都会作为该对象的属性
- tornado.options.parse_command_line()
转化命令行参数,并将转换后的值设置到对应的全局变量options对象相关属性上,并且输入的选项必须define,输入格式为–myoption=myvalue,例
python **.py --port=**
- tornado.options.parse_config_file(path)
从配置文件导入option,配置文件格式
myoption = "myvalue"
myotheroption = "myothervalue"
hello world
# coding:utf-8
import tornado.web
import tornado.ioloop
import tornado.httpserver
class IndexHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello World!")
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application([
(r"/", IndexHandler),
])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(tornado.options.options.port)
tornado.ioloop.IOLoop.current().start()
- app = tornado.web.Application([(r”/”, IndexHandler),]), 路由和handler绑定
- http_server = tornado.httpserver.HTTPServer(app), 构建http_server服务器对象,将app传入绑定
- http_server.listen(tornado.options.options.port),绑定port, 代码等同如下
http_server.bind(8000) #绑定端口
http_server.start(1) #指定开启几个进程
http_server.bind(port)方法是将服务器绑定到指定端口。
http_server.start(num_processes=1)方法指定开启几个进程,参数num_processes默认值为1,即默认仅开启一个进程;如果num_processes为None或者<=0,则自动根据机器硬件的cpu核芯数创建同等数目的子进程;如果num_processes>0,则创建num_processes个子进程。
参考:https://blog.youkuaiyun.com/belalds/article/details/80575755