• 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中实现。

  • 相关阅读:
    内存溢出异常
    Java堆中的对象
    运行时数据区域
    字符串常量池
    自己编译JDK
    @PathVariable注解详解
    spring容器监听器
    redis和spring整合
    Redis安装、启动、关闭
    HDU3974 Assign the task
  • 原文地址:https://www.cnblogs.com/liaofeifight/p/5086327.html
Copyright © 2020-2023  润新知