Python tornado 基础流程

452 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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下面