tornado4.0.2源码简要分析3

此时服务器启动poo对象在等待客户端有链接请求服务器

client发送请求时先创建链接app

event_pairs = self._impl.poll(poll_timeout)socket

此时event_pairs 中保存了事件函数

fd, events = self._events.popitem()oop

try:this

fd_obj, handler_func = self._handlers[fd]spa

    handler_func(fd_obj, events)orm

 

此时的fd为 监听的fd,调用监听对象的回调函数,也就是accept_handlerserver

看 accept_handler代码:对象

def accept_handler(fd, events):

        for i in xrange(_DEFAULT_BACKLOG):

            try:

                connection, address = sock.accept()

            except socket.error as e:

                # _ERRNO_WOULDBLOCK indicate we have accepted every

                # connection that is available.

                if errno_from_exception(e) in _ERRNO_WOULDBLOCK:

                    return

                # ECONNABORTED indicates that there was a connection

                # but it was closed while still in the accept queue.

                # (observed on FreeBSD).

                if errno_from_exception(e) == errno.ECONNABORTED:

                    continue

                raise

            callback(connection, address)

 

先调用accept获取客户端链接对象而后调用callback,此时callback是:

_handle_connection,也就是 TCPServer::_handle_connection,不考虑https链接

建立一个IOStream对象,而后调用 handle_stream,此时的handle_stream其实是

HTTPServer::handle_stream,而后建立一个对应的链接对象HTTP1ServerConnection

_connections 中保存该对象,调用对象的start_serving方法

 

先看 start_serving 方法:

def start_serving(self, delegate):

        """Starts serving requests on this connection.

 

        :arg delegate: a `.HTTPServerConnectionDelegate`

        """

        assert isinstance(delegate, httputil.HTTPServerConnectionDelegate)

        

        self._serving_future = self._server_request_loop(delegate)

        

        # Register the future on the IOLoop so its errors get logged.

        self.stream.io_loop.add_future(self._serving_future,

                                       lambda f: f.result())

这个函数的参数实际上就是 httpserver对象

 

调用了_server_request_loop

在 _server_request_loop 中用@gen.coroutine进行了装饰

@gen.coroutine

    def _server_request_loop(self, delegate):

 

此时的

request_delegate = delegate.start_request(self, conn)

实际调用的是

HTTPServer::start_request

调用 _ServerRequestAdapter

在 _ServerRequestAdapter::__init__中, 调用

server.request_callback.start_request(connection)

 

Application::start_request 返回_RequestDispatcher,结果就是

request_delegate 指向的对象为 _RequestDispatcher

 

 

而后在 gen.coroutine 中调用 _make_coroutine_wrapper,在_make_coroutine_wrapper

调用yielded = next(result)时,调用的就是

_server_request_loop中的conn.read_response(request_delegate)

此时传入的参数实际上就是RequestDispatcher

而后调用_read_message

而后调用delegate.finish() == _RequestDispatcher::finish()

调用 self.execute()

流程代码:

self.handler = self.handler_class(self.application, self.request,

                                          **self.handler_kwargs)

self.handler._execute(transforms, *self.path_args, **self.path_kwargs)

在 _execute 中调用

result = method(*self.path_args, **self.path_kwargs)

在上面的demoget方法中,咱们调用self.write("0"),在write的方法中

实际只是把内容放在writebuffer

self._write_buffer.append(chunk)

而后调用self.finish()

其中调用了self.flush(include_footers=True)

调用

self.request.connection.write_headers(

                start_line, self._headers, chunk, callback=callback)

或者

Self.request.connection.write

而后调用self.request.finish()

而后调用HTTP1Connection::finish()

而后调用 HTTP1Connection::_finish_request()

而后判断是否须要断开链接

if not self.is_client and self._disconnect_on_finish:

self.close()

    return

相关文章
相关标签/搜索