开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
一:tornado基础程序
(1):tornado第一个基础程序
import tornado.ioloop
tornado的核心iO循环模块,封装了linux的epoll和BSD的kqueue
import tornado.web
tornado的web基础框架模块
视图业务处理类
class MainHandler(tornado.web.RequestHandler):
//处理get请求的,不能处理post请求
def get(self):
//对应http请求的方法
//给浏览器响应信息
self.write("Hello, world")
路由
def make_app():
//Application是tornado 的web框架的核心应用类,与服务器对应的接口
return tornado.web.Application([
//保存了路由映射表
(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app()//实例化一个app对象
app.listen(80)//创建了一个http服务器,并绑定了端口
//IOLoop.current():返回当前线程的IOLoop实例
//IOLoop.start():启动IOLoop实例的I/O循环,同时开启了监听
tornado.ioloop.IOLoop.current().start()
(2):tornado高性能原理图
二:httpserver
(1):httpserver对象
app.listen(80)替换为:
import tornado.httpsever//需要引入httpserver模块
//实例化一个http服务器对象
httpServer=tornado.httpserver.HTTPServer(app)
httpServer.listen(80)//绑定端口,此处listen()与app.listen()不是同一个方法
(2)单进程与多进程
1.默认是单进程
2.代码实例
import tornado.httpsever
httpServer=tornado.httpserver.HTTPServer(app)
httpServer.bind(80)
httpServer.start(5)
3.说明
httpServer.bind(80):将服务器绑定到指定的端口
httpServer.start(5):默认开启一个进程;值小于等于0或为None,开启对应服务器cpu核心数个子进程;值大于0则创建对应值个子进程
4.补充说明
app.listen(80)只能在单进程模式中使用
不建议使用上面的方法启动多进程,采用手动启动的方式,即python index.py
原因:
1.每个子进程都会从父进程中复制一份IOLoop的实例,如果在创建子进程前修改了IOLoop,会影响所有的子进程
2.所有的进程都是由一个命令启动的,无法做到在不停止服务的情况下修改代码
3.所有的进程共享一个端口,想分别监控很困难
三:options----需要引入options模块---import tornado.options
(1):tronado为我们提供了一个tornado.options模块,可以进行全局参数的定义,存储,转换
(2)基础方法与属性
1.tornado.options.difine()
原型:
tornado.options.define(name='',default=None,type=None,help=None,metavar=None,multiple=False,group=None,callback=None)
功能:用来定义options选项变量的方法
参数:
#name:选项变量名,必须保证其唯一性,否则会报‘option xxx alerady define in ...’
#default:设置选项变量的默认值,默认None
#type:
1.设置选项变量的类型,从命令行或配置文件导入参数时会根据类型转换输入的值,转换不成会报错,可以是str,int,float...
2.如果没有设置type,会根据default的值进行转换
3.如果default没有设置,那么不进行转换
#multiple:设置选项变量是否可以多个值,默认False
#help;选项变量的帮助提示信息
事例:
tornado.options.define('port',default=80,type=int)
tornado.options.define('list',default=[],type=str)
2.tornado.options.options
--全局的options对象,所有定义的选项变量都会作为该对象的属性
示例:print(tornado.option.options.port) 结果为80(上面的端口号)
获取参数的方法:
tornado.options.parse_command_line()转换命令行参数
例如Python index.py --port=80 --list=goods,picture,image
代码示例:
~~~
import tornado.ioloop
import tornado.web
import tornado.httpsever
import tornado.options
tornado.options.define('port',default=80,type=int)
tornado.options.define('list',default=[],type=str)
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
tornado.options.parse_command_line()
print("list=",tornado.options.options.list)
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app()
httpServer=tornado.httpserver.HTTPServer(app)
httpServer.bind(tornado.options.options.port)
httpServer.start()
tornado.ioloop.IOLoop.current().start()
~~~
3.tornado.options.parse_config_file(path)
--从配置文件导入参数,创建的是普通文件
代码示例
说明:
书写格式仍需按照python的语法要求,不支持字典类型
4.最终版本
--创建一个名为config.py的文件
代码示例:
5:日志
当我们在代码中使用parse_command_line()或者parse_config_file(path)方法时,tornado会默认开启logging模块功能,向屏幕终端输入一些打印信息
关闭日志--需要import tornado.options
if __name__ == "__main__":
tornado.options.options.logging=None//一定要显示在第一行,if下面