走通Tornado框架

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
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值