tornado 的下载&安装
[url:(https://github.com/tornadoweb/tornado)
- 将下载好的tornado 目录 copy到 python的包管理目录下
- cmd终端到包管理目录下的*tornado*目录
- 指令:python setup.py install
tornado 在window上的卸载:
在包管理目录下
C:\Users\Shinelon\AppData\Local\Programs\Python\Python38-32
1.删除当前目录下的tornado文件
2.进入Lib/site-packages 删除 相应的tornado文件
坑点:
在Windows上,Tornado需要使用WindowsSelectorEventLoop。这是Python 3.7和更早版本的默认值,
但Python 3.8默认为事件循环,与Tornado不兼容。在Python 3.8中使用Tornado的应用程序必须在其
主文件/函数的开头调用:
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())。
tornado高性能原理
以Linux的epoll为例:
客户端与服务器响应的时候会自动产生一个socket ,在 linux-epoll中有scoket监听,用来管理所有的客户端中的socket。而在linux-epoll外层
有一个tornado-IOLoop 会一直在循环询问linux-epoll监听中是否有需要执行的socket,如果有tornado—IOLoop会将此socket传递到tornado.web.Application
的路由映射表中查找相应的 handler 中的数据返回给路由映射表,在返回给当前socket,最后返回到客户端。这样一个流程就是tornado高效的原因
{tornado-IOLoop<–询问---->[ linux-epoll(socket监听,socket1,socket2…) ]}<----(socket信号)------>{tornado.web.Application[路由映射表]}<----(url)---->{handlern}
HTTPServer
- httpserver对象
-
myhttpServer = tornado.httpserver.HTTPServer(app)
实例化一个http服务器对象去匹配指定app中的路由:
-
myhttpServer.listen(8000)
服务器绑定端口
-
tornado.ioloop.IOLoop.current().start()
IOLoop.start() 启动IOLoop实例的I/O循环(网络数据传输访问),同时开启了"监听"
-
单进程和多进程
-
注意
tornado服务器默认启动的都是单进程
-
开启多进程
-
代码:
-
myhttpServer = tornado.httpserver.HTTPServer(app)
-
myhttpServer.bind(port)
bind() 将服务器绑定到指定的端口
-
myhttpServer.start(num)
start(num) 默认开启1个进程 值>0,创建对应个数的子进程 值为None 或者 <=0 ,开启对应硬件机器的cpu核心数个子进程
-
补充说明
-
app.listen():
只能在_单_进程模式中使用
-
多进程:
虽然tornado给我们提供了一次性启动多个进程方式,但是由于一些"问题", 不建议使用上面方式启动多进程。 而是手动启动多个进程,并且可以绑定不同的端口
-
问题:
-
问题1:
每个子进程都会从父进程中复制一份IOLoop的实例,如果在创建子进程前修改了IOLoop会影响所有的子进程
-
问题2:
所有的进程都是由一个命令启动的,无法做到在不停止服务的情况下修改代码
-
问题3:
所有进程共享一个端口,想要分别监控很困难
-
Options
-
tornado 提供了便捷的tornado.options模块
- 作用:
- 全局参数的定义,存储,转换
- 作用:
-
基础方法与属性
-
tornado.options.define()
-
tornado.options.options属性
是一个全局的options对象,所有定义的选项变量都会作为该对象的属性
-
options.define()方法的原型:
tornado.options.define(name,default=None,type=None,help=None,metavar=None,multiple=False,group=None,callback=None)
-
选项变量解释:
name:选项变量名,必须保证其唯一性,否则会报错"Option xxx already define in ..." default:设置选项变量的默认值,默认为None type:设置选项变量的类型,从命令行或者配置文件导入参数时,tornado会根据类型转换输入的值,转换不成功会报错,可以是str,float,int,datetime,timedelta - 如果没有设置type,会根据default值进行转换 - 如果default没有设置,就不能进行转换 multiple:设置选项变量是否可以是多个值,默认时False help:选项变量的帮助提示信息 实例:定义的两个options对象 tornado.options.define("port",default=8000,type=int,help="this is a port number and type is int",metavar=None,multiple=False,group=None,callback=None) tornado.options.define("list",default=[],type=str,help="this is a list and type is string ,multiple=True")
-
-
options.define()方法的功能:
用来定义options选项变量的方法
-
-
获取参数的两种方法
-
tornado.options.parse_command_line() 不常用
作用:
可以转换命令行参数
实例:
# 定义变量 tornado.options.define("list",default=[],type=str,help="this is a list and type is string ",multiple=True) # 将命令行的参数转换,并保存到tornado.options.options属性里 tornado.options.parse_command_line() # 使用变量的值 myhttpServer.bind(tornado.options.options.port)
启动:
在指定目录下的cmd中 :python server5.py --port=9000 --list=good,nice,handsome
-
tornado.options.parse_config_file(path) 也不常用
作用:
从配置文件导入参数
代码:
# 定义变量 tornado.options.define("list",default=[],type=str,help="this is a list and type is string ",multiple=True) # 将命令行的参数转换,并保存到tornado.options.options属性里 tornado.options.parse_config_file("config") # 使用变量的值 myhttpServer.bind(tornado.options.options.port) 配置文件: port = 7000 list = ['good','fuck','cool']
启动:
DOS:python server6.py
说明:
配置文件书写格式仍需要按照python的语法要求来写, 它不支持dict字典类型
-
最终版本
-
实例
# 不需要定义options.define()函数的原型变量了 # 不用转换了 myhttpServer.bind(config.options["port"])
-
需要创建一个名为config.py的普通文件
options = { "port":8080, "list":['good','nice','cool'] }
-
启动
DOS:python server7.py
-
-
日志
-
在代码中使用parse_command_line() 或者 parse_config_file()方法时,tornado会默认开启logging模块功能
,他会向屏幕终端输出一些打印信息 -
关闭日志方法:
-
1.在__name__中第一行加入:
tornado.options.options.logging = None
-
2.在DOS中 :
python server5.py --port=2000 -list=good,nice --logging=none
-