Tornado学习笔记12 tornado.httpserver-.非阻塞的Http服务器
是一个非阻塞的,单线程的Http 服务器。
一般地,应用程序很少与HttpServer类直接交互,除非在进程开始时启动服务时(甚至在使用tornado.web.Applicaiton.listen时也是间接与HttpServer交互)。
12.1 定义
class HTTPServer(TCPServer, Configurable,
httputil.HTTPServerConnectionDelegate):
12.2 功能描述
为了向后兼容,HttpServer是HttpServerConnectionDelegate的子类,有一个将HttpServerRequest作为参数的回调函数。这个委托(delegate)一般是tornado.web.Application.
如果客户端的请求头中指定了Connection:keep-alive的话,HttpServer支持活动的连接。而且,HttpServer是默认支持活动连接的。
如果xheaders选择设置成True,HttpServer同样支持x-Real-Ip/X-Forwarded-For以及X-Scheme/X-Forwarded-proto请求头,这样对所有的请求都会覆盖远程IP和URI协议。当在运行反向代理或者负载均衡时,这些头文件会很有用。
为了是HttpServer满足SSL的需求,给ssl.SSLContext对象传送ssl-options关键字作为参数,代码示例如下
ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_ctx.load_cert_chain(os.path.join(data_dir, "mydomain.crt"),
os.path.join(data_dir, "mydomain.key"))
HTTPServer(applicaton, ssl_options=ssl_ctx)
12.3 HttpServer的初始化
以下三种方式来实现HttpServer的初始化。初始化方法定义在tornado.tcpserver.TCPServer这个类中。
(1) listen:单一进程。
server = HTTPServer(app)
server.listen(8888)
IOLoop.current().start()
(2) bind/start:简单的多个进程
server = HTTPServer(app)
server.bind(8888)server.start(0) # Forks multiple sub-processes
IOLoop.current().start()
(3) add_sockets:高级的多进程。
sockets = tornado.netutil.bind_sockets(8888)
tornado.process.fork_processes(0)
server = HTTPServer(app)
server.add_sockets(sockets)
IOLoop.current().start()
add_sockets这个接口更加复杂,但是这个可以使用tornado.process.fork_processes以便在处理交叉进程时更加灵活的处理。
12.4方法
12.4.1 构造函数
不实现,由父类的TCPServer、Configurable负责具体实现。
12.4.2 initialize
(1) 定义
def initialize(self, request_callback, no_keep_alive=False, io_loop=None,
xheaders=False, ssl_options=None, protocol=None,
decompress_request=False,
chunk_size=None, max_header_size=None,
idle_connection_timeout=None, body_timeout=None,
max_body_size=None, max_buffer_size=None):
(2) 实现
self.request_callback = request_callback
self.no_keep_alive = no_keep_alive
self.xheaders = xheaders
self.protocol = protocol
self.conn_params = HTTP1ConnectionParameters(
decompress=decompress_request,
chunk_size=chunk_size,
max_header_size=max_header_size,
header_timeout=idle_connection_timeout or 3600,
max_body_size=max_body_size,
body_timeout=body_timeout)
TCPServer.__init__(self, io_loop=io_loop, ssl_options=ssl_options,
max_buffer_size=max_buffer_size,
read_chunk_size=chunk_size)
self._connections = set()
实现的逻辑说明如下:
Ø 设置属性,比如request_callback、no_keep_alive、xheaders、protocol等
Ø 设置conn_params属性,这个比较重要,是一个Http1ConnectionParameters类的示例,表示连接参数属性对象。
Ø 初始化TCPServer.
Ø 初始化内部属性_connections,为httpConnections集合。
12.4.3 处理请求流 handle_stream
def handle_stream(self, stream, address):
context = _HTTPRequestContext(stream, address,
self.protocol)
conn = HTTP1ServerConnection(
stream, self.conn_params, context)
self._connections.add(conn)
conn.start_serving(self)
实现逻辑如下:
(1) 初始化_HTTPRequestContext对象,为请求的上下文对象context
(2) 初始化HTTP1ServerConnection对象为请求连接对象conn,将conn上下文对象作为参数传递。
(3) 调用conn的start_serving方法。
12.4。4 开始请求start_request
def start_request(self, server_conn, request_conn):
return _ServerRequestAdapter(self, server_conn, request_conn)
返回内部的_ServerRequestAdapter对象。传递两个连接对象,一个服务器连接对象server_conn(HTTP1ServerConnection类型),一个是请求连接对象request_conn(HTTP1Connection类型)..
12.4.5 关闭 on_close
def on_close(self, server_conn):
self._connections.remove(server_conn)
关闭HttpServer的所有服务器连接对象。
12.5 总结
从HttpServer源代码可以看出,HttpServer负责处理所有的请求,每一个请求对应一个服务器端连接(HTTP1ServerConnection),一个请求端的连接(HTTP1RequestConnection)、_ServerRequestAdapter以及一个请求上下文对象(_HttpRequestContext)。
同时,HttpServer继承于TCPServer、Configurable、HTTPServerConnectioneDelegate三个父类。对请求的处理主要在TCPServer中实现。
Tornado学习笔记12 tornado.httpserver-.非阻塞的Http服务器的更多相关文章
- tornado 学习笔记4 异步以及非阻塞的I/O
Read-time(实时)的网站需要针对每个用户保持长时间的连接.在传统的同步网站服务中,通常针对每个用户开启来一个线程来实现,但是这样做非常昂贵. 为了使并发连接的成本最小化,Tornada使用单个 ...
- Node.js学习笔记(六) --- Nodejs 的非阻塞 I/O、 异步、 事件驱动
1. Nodejs 的单线程 非阻塞 I/O 事件驱动在 Java. PHP 或者.net 等服务器端语言中,会为每一个客户端连接创建一个新的线程.而每个线程需要耗费大约 2MB 内存.也就是说,理论 ...
- tornado学习笔记19 Tornado框架分析
19.1 Http服务器请求处理流程图 (1) 调用HTTPServer的bind方法,绑定Socket的监听端口号: (2) 调用HTTPServer的listen方法,初始化一个listen so ...
- tornado 学习笔记9 Tornado web 框架---模板(template)功能分析
Tornado模板系统是将模板编译成Python代码. 最基本的使用方式: t = template.Template("<html>{{ myv ...
- tornado 学习笔记2 Python web主流框架
2.1 Django 官方网址:https://www.djangoproject.com/ 简介:Django is a high-level Python Web framework that e ...
- Tornado学习笔记(一) helloword/多进程/启动参数
前言 当你觉得你过得很舒服的时候,你肯定没有在进步.所以我想学习新的东西,然后选择了Tornado.因为我觉得Tornado更匹配目前的我的综合素质. Tornado学习笔记系列主要参考<int ...
- tornado 学习笔记1 引言
从事软件开发这行业也快5年啦,其实从事的工作也不完全是软件开发,软件开发只是我工作中的一部分.其中包括课题研究.信息化方案设计.软件开发.信息系统监理.项目管理等工作,比较杂乱.开发的软件比较多,但是 ...
- Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点
Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...
- Ext.Net学习笔记12:Ext.Net GridPanel Filter用法
Ext.Net学习笔记12:Ext.Net GridPanel Filter用法 Ext.Net GridPanel的用法在上一篇中已经介绍过,这篇笔记讲介绍Filter的用法. Filter是用来过 ...
随机推荐
- UITableViewCell的重用机制
UITabelView一般会显示大量数据,如果有多少条数据就新建多少个cell,那么对于内存来说是种极大的负担,这样自然是不合理的,所以才会有重用机制 比如一个家庭办酒席,一共有13桌,每桌20个菜, ...
- [NHibernate]ISessionFactory配置
系列文章 [Nhibernate]体系结构 引言 在上篇文章学习了orm和nhibernate相关概念,这篇文章主要学习ISessionFactory如何配置. 因为NHibernate被设计为可以在 ...
- glusterFS系统中文管理手册(转载)
GlusterFS系统中文管理手册 1文档说明 该文档主要内容出自 www.gluster.org 官方提供的英文系统管理手册<Gluster File System 3.3.0 A ...
- Excel 自动更正
当有复杂的字段需要重复填写怎么办呢,比如××银行卡号,××电话号码,××公司地址等.可以使用excel的"自动更正"功能解决. 1. Excel 2010的自动更正选项在哪里呢 2 ...
- LYDSY模拟赛day2 Divisors
/* 注意分解质因数,如果i是,那么n/i也是,这样就可以解决分解质因数的时间问题了 当 k ≥ 1 时,只有这些数的约数才会对答案产生贡献. 求出 m 个数的所有不超过 n 的约数,去重后统计即可. ...
- DAY5 DVWA之SQL注入演练(low)
1.设置 把安全等级先调整为low,让自己获得点信心,免得一来就被打脸. 2.测试和分析页面的功能 这里有一个输入框 根据上面的提示,输入用户的id.然后我们输入之后,发现它返回了关于这个 ...
- SAM/BAM文件处理
当测序得到的fastq文件map到基因组之后,我们通常会得到一个sam或者bam为扩展名的文件.SAM的全称是sequence alignment/map format.而BAM就是SAM的二进制文件 ...
- linux c 笔记-3 c语言基础知识
关键字 数据类型: 简单(7):int long short float double char enum 复杂(2):struct union 类型修饰符(8):auto unsigned sign ...
- PHP - xhprof+Graphviz 安装配置
简介:XHProf是Facebook放出的轻量级调试工具.和Xdebug相比,XHProf更加易用和可控,尤其是生成流程图和调试数据对比的功能很好很强大. 参考:http://us2.php.net/ ...
- JS判断是否是微信页面,判断手机操作系统(ios或android)并跳转到不同下载页面
JS判断客户端是否是iOS或者Android 参考:http://caibaojian.com/browser-ios-or-android.html function is_weixin() { v ...