tornado学习笔记day01-高并发性能web框架

tornado的安装

这里我使用的是虚拟环境中的pip安装,配合清华大学镜像源安装的

pip install tornado -i https://pypi.tuna.tsinghua.edu.cn/simple

我的第一个tornado程序

import tornado.web
import tornado.ioloopclass IndexHandler(tornado.web.RequestHandler):'''主页处理函数'''def get(self):self.write("hello tornado!")if __name__ == '__main__':app = tornado.web.Application([(r"/",IndexHandler)])app.listen(8000)tornado.ioloop.IOLoop.current().start()

在tornado中,直接执行就行,不用加任何参数也OK

因为在里面已经帮你创建了一个服务器了

初始tornado

什么是tornado

全称tornado web server ,是一种web服务器软件的开源版本

特点

作为web 框架,是一个轻量级的web框架,类似于另一个python web 框架 web.py,其拥有一部非阻塞IO的处理方式

作为 web 服务器,tornado 有较为出色的抗负载能力,官方用nginx反向dialing的方式部署tornado和其他python web 应用框架进行对比,结果最大浏览量超过第二名近40%

使用场景

  • 用户量大,高并发
  • 大量的HTTP持久连接
    • 使用同一个TCP连接来发送和接收多个HTTP请求/应答,而不是为每一个新的请求/应答打开新的连接方式
    • 对于HTTP1.0,可以在请求的包头(Header)中添加Connection: Keep-Alive。
    • 对于HTTP 1.1,所有的连接默认都是持久连接。

C10K

上面的高并发的为题,通常用C10K这一概念来描述.C10K-Concurrently handling ten thousand connections ,即并发10000个连接,对于单台服务器而言,根本无法承担,而采用多台服务器分布式又意味着高昂的成本

性能

tornado在设计之初就考虑到了性能因素,旨在解决C10K问题,这样的设计使得其成为一个拥有非常高性能的解决方案(服务器与框架的集合体)

tornado和django对比

django

django是走大而全的方向,注重的是高效开发,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构,以及全功能的管理后台

Django提供的方便,也意味着Django内置的ORM跟框架内的其他模板耦合程度高,应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利

特点:

  • session功能
  • 后台管理
  • ORM

tornado

tornado走的是少而精的方向,注重的是性能的优越,它最出名的是异步非阻塞的设计方式
特点

  • HTTP服务器
  • 异步编程
  • webSockets

第一个程序的批注解释1.0

import tornado.web
'''
tornado的基础web框架模块
'''
import tornado.ioloop
'''
tornado的核心IO循环模块,
封装了Linux的epoll和BSD的kqueue
这个是tornado高效的基础
'''# 业务处理类
# 类比Django的视图
class IndexHandler(tornado.web.RequestHandler):'''主页处理函数'''# 处理GET请求的def get(self):'''这个get不是随便写的,是框架提前定义好的:return:'''# 对应HTTP请求的方法# 给浏览器响应信息self.write("hello tornado!")if __name__ == '__main__':# 这个路由和django差不多,只不过这个调用的是一个类# 实例化app应用对象# Application是tornado框架的核心,与服务器对接的接口# 里面保存了路由映射表,有一个listen方法,用来创建一个HTTP服务器的实例,并绑定了端口app = tornado.web.Application([(r"/",IndexHandler)])# 这个只是绑定在8000端口,注意:并没有进行监听奥app.listen(8000)# tornado的启动方式# IOLoop.current():返回当前线程的IO实例# IOLoop.start(): 启动实例的IO循环,同时开启监听tornado.ioloop.IOLoop.current().start()

第一个程序的批注解释2.0

import tornado.web
'''
tornado的基础web框架模块
'''
import tornado.ioloop
'''
tornado的核心IO循环模块,
封装了Linux的epoll和BSD的kqueue
这个是tornado高效的基础
'''# 引入httpserver模块
import tornado.httpserver# 业务处理类
# 类比Django的视图
class IndexHandler(tornado.web.RequestHandler):'''主页处理函数'''# 处理GET请求的def get(self):'''这个get不是随便写的,是框架提前定义好的:return:'''# 对应HTTP请求的方法# 给浏览器响应信息self.write("main page info tornado!")if __name__ == '__main__':# 这个路由和django差不多,只不过这个调用的是一个类# 实例化app应用对象# Application是tornado框架的核心,与服务器对接的接口# 里面保存了路由映射表,有一个listen方法,用来创建一个HTTP服务器的实例,并绑定了端口app = tornado.web.Application([(r"/",IndexHandler)])# 这个只是绑定在8000端口,注意:并没有进行监听奥# app.listen(8000)# 实例化一个http服务器对象httpServer = tornado.httpserver.HTTPServer(app)# 绑定端口httpServer.listen(8000)# 这个和上面的listen可不一样,两个对象的方法,不同# 说白了,上面的一行,相当于我们这个两行代码的和# 这也就是tornado不用像Django那样加上runserver参数启动服务器了# 以为代码中写了tornado.ioloop.IOLoop.current().start()

第一个程序的批注解释3.0

import tornado.web
import tornado.ioloop
import tornado.httpserverclass IndexHandler(tornado.web.RequestHandler):'''主页处理函数'''def get(self):'''这个get不是随便写的,是框架提前定义好的:return:'''self.write("main page info tornado!")if __name__ == '__main__':app = tornado.web.Application([(r"/",IndexHandler)])httpServer = tornado.httpserver.HTTPServer(app)# httpServer.listen(8000)# 这里不用listen了,我们用bind# 将服务器绑定到指定的端口上httpServer.bind(8000)# 这里我写几个就开几个进程'''默认开启一个进程如果大于0,开启多个进程值为none或者小于等于0的话,就开启对应硬件机器CPU核心数的子进程'''httpServer.start(5)# 这个bind和start加一起就相当于 httpServer.listen(8000)了# 近期你可以多些一点,以为你要对于创建服务器的流程有一个了解,以后随便写# app.listen() 只能在单继承模式中使用'''多进程: 虽然tornado给我们提供了一次性启动多进程的方式,但是由于一些原因,我们不建议使用这种方式,来启动多进程,而是手动启动多进程,并且还能绑定多个端口多进程有三个问题:1. 每个紫禁城都会从父进程中复制出一份IOloop的实例,如果在创建紫禁城钱,修改了IOloop,会影响到所有的紫禁城实例2. 所有的进程都是由一个命令启动的,无法做到在不停止服务的情况下修改代码,这样不好3. 所有进程共享一个端口,想要进行监控,有点难我自己来启动的话,能在一个进程运行后,修改源代码,来单独在运行一遍,也OK'''tornado.ioloop.IOLoop.current().start()

第一个程序的批注解释4.0

import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options"""
通常如果程序非正常结束
就会出现:"通常每个套接字地址(协议/网络地址/端口)只允许使用一次"
这是因为端口没有没释放
这时我们的debug模式还没开启tornado为我们提供了一tornado.option模块
用于全局参数的定义/存储/转换
option:不让端口写死,让option这个值从外部传进来
基础方法与属性:
help : 其实就是选项变量的帮助提示信息,一般不用         
"""# 这个函数的原型
'''
def define(name: str,default: Any = None,type: type = None,help: str = None,metavar: str = None,multiple: bool = False,group: str = None,callback: Callable[[Any], None] = None,
) -> None:
'''
# 这个函数的功能
'''
用来定义option选项变量的方法
'''
# 参数
'''
name : 选项变量名,必须保证其唯一性,否则会爆出一个option already define 错误
default : 设置选项变量的默认值,如果不传,默认为none
type : 设置选项变量的类型,比如int,从命令行或者配置文件导入参数时,tornado会根据输入的数据类型的值进行转换会根据类型转换成对应的值,转换不成,会报错,那么就有问题了可以:int float str datetime timedelta如果没有设置type,会根据default的值进行转换,如果default没有设置,他就不进行转换
multiple : 设置选项变量是否可以为多个值,默认为false    
'''# 好我们可以先写一个
tornado.options.define("port", default=8000, type=int)
# 我们要接受一个列表,列表里面的元素的字符串类型,默认给个空
tornado.options.define("list", default=[], type=str,multiple=True)# 然后我们还有一个属性
'''
tornado.options.options
全局的options对象
所有定义的选项变量都会作为改对象的属性
'''# 获取参数的方法
'''
我们不是把这些参数赋值了么,我们还要把这些参数存储起来
tornado.options.parse_command_line()作用:转换命令行参数,将命令行参数抓换成为option的属性
'''class IndexHandler(tornado.web.RequestHandler):def get(self):self.write("main page info tornado!")if __name__ == '__main__':# 转换命令行参数,并保存在tornado.options.options里面tornado.options.parse_command_line()# 可以打印一下listprint('list->',tornado.options.options.list)app = tornado.web.Application([(r"/", IndexHandler)])httpServer = tornado.httpserver.HTTPServer(app)# 使用变量的值httpServer.bind(tornado.options.options.port)httpServer.start(1)tornado.ioloop.IOLoop.current().start()# 这样我们在启动的时候就能不需要修改代码就能指定端口号了# 代码能少改就少改变'''(venv) D:\PycharmProjects\itcast_tornado>python 01.py --port=9000 --list=good,nice,handsome,coollist-> ['good', 'nice', 'handsome', 'cool'][I 191205 17:13:54 web:2246] 200 GET / (127.0.0.1) 1.00ms[W 191205 17:13:54 web:2246] 404 GET /favicon.ico (127.0.0.1) 1.00ms'''

创建配置文件方式

在linux里面,所有的东西都是文件,就算他是目录,都是文件

创建一个名为config的普通文件,位置在py文件的旁边

内容如下:

port = 7000
list = ["good","nice","handsome"]

程序中这样写:

tornado.options.parse_config_file("config")
# 因为是同级目录,所以相对路径直接写就OK了

然后正常运行程序就OK了

D:\PycharmProjects\itcast_tornado\venv\Scripts\python.exe D:/PycharmProjects/itcast_tornado/01.py
list-> ['good', 'nice', 'handsome']
[I 191205 17:27:21 web:2246] 200 GET / (127.0.0.1) 0.00ms
[W 191205 17:27:21 web:2246] 404 GET /favicon.ico (127.0.0.1) 0.00ms

我们现在有两种方式来获得参数,一种是命令行的一种是文件的,但是以后我们要使用哪种方式呢,???

都不是…

说明:
因为这个配置文件要按照python 的语法要求来进行书写
调用参数的时候,不支持字典类型

最终版本:
创建一个名为config.py的文件
内容如下:

# 参数 字典类型的了options = {"port": 8080,"list": ["good", "nice", "handsome"]
}

脚本这样写:

import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options
import config# 获取参数的方法
# 好我们可以先写一个
tornado.options.define("port", default=8000, type=int)
# 我们要接受一个列表,列表里面的元素的字符串类型,默认给个空
tornado.options.define("list", default=[], type=str, multiple=True)class IndexHandler(tornado.web.RequestHandler):def get(self):self.write("main page info tornado!")if __name__ == '__main__':# 可以打印一下listprint('list->', config.options["list"])app = tornado.web.Application([(r"/", IndexHandler)])httpServer = tornado.httpserver.HTTPServer(app)# 使用变量的值httpServer.bind(config.options["port"])httpServer.start(1)tornado.ioloop.IOLoop.current().start()

这个config可以写成模板,其中可以包含各种配置信息,不仅仅局限于这点儿

日志

当我们使用parse_command_line()或者parse_config_file(path)方法时

tornado会默认开启logging模块功能,向我们的屏幕打印一些相关信息

如果有处女座不想看这个信息,可以这样

比如是从普通文件中导入的那种,要在后面再加上一句:

tornado.options.parse_config_file("config")
tornado.options.options.loggings = None

相似文章

tornado学习笔记day01
tornado学习笔记day02
tornado学习笔记day03
tornado学习笔记day04
tornado学习笔记day05
tornado学习笔记day06
tornado学习笔记day07
tornado学习笔记day08

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python99乘法表while翻译_Python学习之while练习--九九乘法表

效果如下&#xff1a;实现代码;m 1n 1while(m<10):while(n<m):print(n,"*",m,"",m*n,end \t)n 1print(\n)n 1m 1解析&#xff1a;这是一个很简单的while嵌套程序&#xff0c;首先分析九九乘法表是从上往下逐行增加&#xff0c;且第一列乘积为1…

ASP.NET Core 2加入了Razor页面特性

最近发布的ASP.NET Core 2.0&#xff0c;连同新发布的.NET Core 2和Entity Framework Core 2.0y&#xff0c;一并构成了.NET Core 2.0生态中的三元组。此发布给出了多个新特性和改进&#xff0c;其中包括通用性能的改进、Razor页面、新的开发模板以及更好的Azure Diagnostics支…

matlab 矩阵拼接

E[a&#xff0c;b]%水平方向上的拼接 E[a &#xff1b;b] %垂直方向上的拼接 转载于:https://www.cnblogs.com/hsy1941/p/7124083.html

JM8.5中的7种宏块模式问题 - zhoujunming的专栏 - CSDN博客

JM8.5中的7种宏块模式问题 收藏 Outline: 1、 CFG文件中有关可变尺寸宏块模式的相关选项2、 7种宏块模式对应的数值常量3、 7种宏块模式被分成宏块和亚宏块4、 如何对宏块和亚宏块的运动估计&#xff0c;采用一个共同的函数来处理5、 遗留问题1、CFG文件中有关可变尺寸宏块…

tornado学习笔记day02-进阶与提升

整理基础工程 请看第一天的配置文件目录,搭建了一个框架的基础目录 Application settings debug 作用 可以设置tornado是否工作在调试模式下面,默认为false,即工作在生产模式下 true的特性: 自动重启: tornado程序会监控源代码文件,会自动重启服务器,减少我们手动重启…

python123测验2答案八边形_Python试卷

3、写一个函数&#xff0c;计算一个给定的日期是该年的第几天。def getday(self,yNone,mNone,dNone):date datetime(y,m,d)days date.strftime(%j)return days4、写一个函数&#xff0c;给定N&#xff0c;返回斐波那契数列第N项。def getn_vlaue(self,n):if n<2:return 1e…

java实体类如果不重写toString方法,会如何?

先认识一下Object Object 类的 toString 方法 返回一个字符串&#xff0c;该字符串由类名&#xff08;对象是该类的一个实例&#xff09;、at 标记符“”和此对象哈希码的无符号十六进制表示组成。换句话说&#xff0c;该方法返回一个字符串&#xff0c;它的值等于&#xff1a;…

H.264 中很有用的一些概念

Q:PSNR 峰值信噪比 是根据它来取qp是不是&#xff1f; A:不是 和QP没有直接关系但是QP的选择会影响到PSNR Q: 如果不用率失真最优化&#xff0c;为什么选择SATD&#xff0b;deltar&#xff08;mv&#xff0c;mode&#xff09;作为模式选择的依据&#xff1f;为什么运动估…

tornado学习笔记day03-响应输出

write: 作用: 将chunk中的数据写到输出缓冲区 利用write方法写json数据 我们自己手动序列化json的那种方式Content-Type 的属性值为text-html而我们采用write自动序列化方式,我们的content-type 属性为application/json set_default_headers(): 作用: 在进入HTTP响应方法…

Machine Learning——octave矩阵操作(2)——DAY3

矩阵的数学操作&#xff1a; Assumed: a为一个矩阵&#xff0c;m是一个向量 Log(a)——求每一个元素的对数 Exp(a)——以e为底的指数 1./a——求每个元素的导师 [a,b]max(m)——m是一个向量&#xff0c;a为m当中最大的元素&#xff0c;b为a在m中的排列序号&#xff08;已按从小…

python 多进程并发_python并发编程之多进程

一 multiprocessing模块介绍python中的多线程无法利用多核优势&#xff0c;如果想要充分地使用多核CPU的资源(os.cpu_count()查看)&#xff0c;在python中大部分情况需要使用多进程。Python提供了multiprocessing。multiprocessing模块用来开启子进程&#xff0c;并在子进程中执…

tornado学习笔记day04-执行顺序

响应输出 -> write 原型 self.write()函数 源码中是这样定义的 def write(self, chunk: Union[str, bytes, dict]) -> None:作用 将chunk数据写到缓冲区 刷新缓冲区的四种方式 程序中断手动刷新缓冲区满了遇到\n 当你写了一个print之后,不是直接就显示在黑屏中断…

字符串中文判断

2019独角兽企业重金招聘Python工程师标准>>> 1、判断字符串是否全是中文或含有中文 <?php header(Content-type:text/html; charsetutf-8); $str 你好; if(preg_match(/^[\x{4e00}-\x{9fa5}]$/u, $str)>0){ echo 全是中文; …

angular使用动态组件后属性值_Angular动态加载组件

引言有时候需要根据URL来渲染不同组件&#xff0c;我所指的是在同一个URL地址中根据参数的变化显示不同的组件&#xff1b;这是利用Angular动态加载组件完成的&#xff0c;同时也会设法让这部分动态组件也支持AOT。动态加载组件下面以一个Step组件为示例&#xff0c;完成一个3个…

分治2--取余运算

分治2--取余运算 一、心得 二、题目和分析 题目描述 输入b&#xff0c;p&#xff0c;k的值&#xff0c;求bp mod k的值。其中b&#xff0c;p&#xff0c;k*k为长整型数。输入 三个整数&#xff0c;分别为b&#xff0c;p&#xff0c;k的值输出 bp mod k样例输入 2 10 9样例输出 …

-mysql-锁机制分为表级锁和行级锁

2019独角兽企业重金招聘Python工程师标准>>> 声明&#xff1a;本栏目所使用的素材都是凯哥学堂VIP学员所写&#xff0c;学员有权匿名&#xff0c;对文章有最终解释权&#xff1b;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 mysql锁机制分为表级锁和行级锁 …

tornado学习笔记day05-访问数据库

模板## 配置模板路径 这个在之前我们已经配置好了,可以参考前面的文章 settings {# 就像upfile就没有,你写了也白扯template_path: os.path.join(BASE_DIR, "templates"), }渲染并返回给客户端 使用render()方法 class HomeIndexHandler(RequestHandler):def ge…

pythonelectron桌面开发案例_使用Electron开发基于Node.js的桌面应用

最近小编在查看分享资料时&#xff0c;发现一个可以开发跨平台桌面应用的框架——NW.js(原名&#xff1a;node-webkit)。正当小编兴致勃勃的研究NW.js的时候&#xff0c;最基础的安装环节出了问题。无论用npm还是cnpm都无法完整下载所依赖的包(具体原因待考察)。鉴于此&#xf…

x264_param_t结构体参数分析

参考网上的一些资料&#xff0c;结合个人的理解&#xff0c;对x264中x264_param_t结构体作了初步的分析&#xff0c;不保证正确。对x264熟悉的朋友可以在这基础上修改添加typedef struct x264_param_t{/* CPU 标志位 */unsigned int cpu;int i_threads; /* 并行编…

知识点总结

1、把一个类转换成一个xml&#xff0c;首先&#xff0c;类名前需要加特性&#xff0c;[DataContract(Namespace "http://CYSoft.Services/AuthorizationObject")]&#xff0c;[XmlRoot("Org")]&#xff0c;里边的名字为根节点的名字&#xff0c;对各个属性…