socketserver 源码阅读

栏目: 服务器 · 发布时间: 7年前

内容简介:首先看到文件上半部分的注释,讲清楚了这个module里的类继承关系。不在上面描述的有线程和进程模型,它们是通过Mixin实现的。一个同步的服务器基本上 就是以下这样的套路:socketserver 也不例外,虽然里面用到了

首先看到文件上半部分的注释,讲清楚了这个module里的类继承关系。

+------------+
| BaseServer |
+------------+
        |
        v
+-----------+        +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+        +------------------+
        |
        v
+-----------+        +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+        +--------------------+

不在上面描述的有线程和进程模型,它们是通过Mixin实现的。一个同步的服务器基本上 就是以下这样的套路:

import socket

sock = socket.socket()
sock.bind(('localhost', 8080))
sock.listen()


def handle(conn, client_addr):
    conn.send(b"some data")
    conn.close()


while True:
    conn, client_addr = sock.accept()
    handle(conn, client_addr)

socketserver 也不例外,虽然里面用到了 selectors.PollSelector ,这个文件里最精彩 的部分在于实现 ThreadingMixInForkingMixIn 。我也来写一个更简单的版本:

import socket
import threading
import selectors


class BaseServer:
    def __init__(self):
        self.selector = selectors.PollSelector()

    def fileno(self):
        raise NotImplemented()

    def handle_request(self):
        raise NotImplemented()

    def serve_forever(self):
        self.selector.register(self, selectors.EVENT_READ)

        while True:
            if self.selector.select():
                self.handle_request()


class TCPServer(BaseServer):
    def __init__(self):
        super().__init__()
        self.socket = socket.socket()
        self.socket.bind(('localhost', 8080))
        self.socket.listen()

    def fileno(self):
        return self.socket.fileno()

    def handle_request(self):
        return self.__handle_request()

    def _handle_request(self):
        conn, addr = self.socket.accept()
        conn.send(b'hello world\n')
        conn.close()


class ThreadingMixIn:
    def handle_request(self):
        t = threading.Thread(
            target=self._handle_request,
        )
        t.start()


class ThreadingTCPServer(ThreadingMixIn, TCPServer):
    pass


if __name__ == "__main__":
    # TCPServer().serve_forever()
    ThreadingTCPServer().serve_forever()

以上所述就是小编给大家介绍的《socketserver 源码阅读》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

再启动

再启动

[日] 大前研一 / 田龙姬、金枫 / 中华工商联合出版社有限责任公司 / 2010-1 / 29.00元

1、“全球管理大师”、“日本战略之父”大前研一,职场励志最新巨作。 2、2010年1月中华工商联合出版社有限责任公司与日知公司继《货币战争2》《中国大趋势》之后,再度联手,重磅推出。 3、震撼中国职场的宗师级巨作,势必引领2010年中国职场4、世界著名出版商小学馆授予独家中文简体出版权。 5、试问,哪个老板不希望自己的员工不断实现自身的“再启动”呢? 6、只有不断激励鞭策自......一起来看看 《再启动》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具