Python SocketServer.py 源码分析(三)

前面我们见识了实现TCPServer的方法。最早关于介绍BaseServer的时候,我们知道python对BaseServer设计的时候,预留了可用于Mixin扩展多线程或多进程的接口。mixin通过复写父类的parse_request方法实现。

ThreadingMixIn

ThreadingMixIn 类实现了多线程的方式,它只有两个方法,分别是process_request和 process_request_thread方法。多进程的方式是ForkingMixIn,暂且略过。

process_request

def process_request(self, request, client_address):
    t = threading.Thread(target = self.process_request_thread,
                         args = (request, client_address))
    t.daemon = self.daemon_threads
    t.start()

process_request方法复写了父类的此方法。以此为接口入口,对每一个请求,调用Thread开启一个新的线程。每一个线程都绑定process_request_thread方法。

process_request_thread

    def process_request_thread(self, request, client_address):
        try:
            self.finish_request(request, client_address)
            self.shutdown_request(request)
        except:
            self.handle_error(request, client_address)
            self.shutdown_request(request)

process_request_thread方法和BaseServer里的parse_request几乎一样。只不过是多线程的方式调用。

使用的时候,通过多继承调用接口,例如:

class ThreadingTCPServer(ThreadingMixIn, TCPServer): 
    pass

具体的调用过程如下:


ThreadingMixIn -- TCPServer - StreamRequestHandler

__init__(server_address, RequestHandlerClass): 
    BaseServer.server_address
    BaseServer.RequestHandlerClass

    TCPServer.socket = socket.socket(self.address_family, self.socket_type)
    TCPServer.server_bind()
    TCPServer.server_activate()

serve_forever(): 

    select() 

    BaseServer._handle_request_noblock()

        TCPServer.get_request() -> request, client_addres
            socket.accept()

        BaseServer.verify_request()

            BaseServer.process_request()

                ThreadingMixIn.process_request()
                    t = threading.Thread(target = ThreadingMixIn.process_request_thread)

                    ThreadingMixIn.process_request_thread

                        BaseServer.finish_request(request, client_address)

                            BaseServer.RequestHandlerClass()

                                BaseRequestHandler.__init__(request)

                                    BaseRequestHandler.request
                                    BaseRequestHandler.client_address = client_address

                                    StreamRequestHandler.setup()

                                        StreamRequestHandler.connection = StreamRequestHandler.request
                                        StreamRequestHandler.rfile
                                        StreamRequestHandler.wfile

                                    BaseRequestHandler.handle()

                                    StreamRequestHandler.finsih()
                                        StreamRequestHandler.wfile.close()
                                        StreamRequestHandler.rfile.close()

                        BaseServer.shutdown_request(request)
                            TCPServer.shutdown()
                                request.shutdown()
                            TCPServer.close_request(request)
                                request.close()

            TCPServer.shutdown_request(request)
                TCPServer.shutdown(request)
                    request.shutdown()
                TCPServer.close_request(request)
                    request.close()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,924评论 18 139
  • 第十天 权限修饰符 public protected default private 同一类 true true ...
    炙冰阅读 560评论 0 1
  • Volley源码分析之流程和缓存 前言 Android一开始提供了HttpURLConnection和HttpCl...
    大写ls阅读 636评论 0 6
  • 万历甲辰(1604年)春,诗人王百谷七十开庆,“秦淮八艳”之一马湘兰买船载歌妓数十人,前往苏州置酒祝寿。“宴饮累月...
    陈子弘阅读 944评论 2 5