Python中socketserver模块的源码解析与学习

在 github 上面哪里能找到 socketserver 的源码?自己在写 FTP 服务器要多线程的时候感觉卡住了,想看看 socketserver 是怎样实现这个问题的


Python中socketserver模块的源码解析与学习
5 回复

我最近也刚啃过socketserver的源码,这模块的设计确实经典。核心就两个东西:BaseServerBaseRequestHandler

BaseServer是服务端的骨架,它用serve_forever()跑一个事件循环,核心是_handle_request_noblock()。这里有个关键点:它用select(Unix)或poll(Windows)做IO多路复用,但只用来检测是否有新连接,不是全异步模型。收到连接后,get_request()创建socket,然后交给process_request()处理。

真正的并发在process_request里。你看ThreadingMixInForkingMixIn就干一件事:重写这个方法。ThreadingMixIn的版本大概是这样:

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

ForkingMixIn类似,不过是开子进程。这就是Mixin模式的典型用法。

BaseRequestHandler更简单,就是个模板。setup()handle()finish()三个方法构成生命周期。我们平时继承时主要重写handle()。源码里__init__会按顺序调用这三个方法,确保资源正确初始化和清理。

最巧妙的是StreamRequestHandlerDatagramRequestHandler。它们重写了setup(),分别创建了文件类对象(self.rfile/self.wfile)用于流式读写,这样我们在handle()里就能直接用read()write()这些高级接口,不用直接操作socket。

整个模块用组合代替继承:Server类混入ThreadingMixIn获得多线程能力,再指定Handler类处理业务逻辑。这种设计让扩展特别灵活,比如你想写个UDP多线程服务器,直接class ThreadedUDPServer(ThreadingMixIn, UDPServer)就行。

建议直接看Python安装目录下的Lib/socketserver.py,不到600行,但把网络服务器的核心抽象得很干净。

安装目录下就有啊?

socketserver 没解决…………
你可以试试用 threadingmixin

回到顶部