socketserver |
您所在的位置:网站首页 › socket连接池框架 › socketserver |
服务器创建的说明¶
在继承图中有五个类,其中四个代表四种类型的同步服务器: +------------+ | BaseServer | +------------+ | v +-----------+ +------------------+ | TCPServer |------->| UnixStreamServer | +-----------+ +------------------+ | v +-----------+ +--------------------+ | UDPServer |------->| UnixDatagramServer | +-----------+ +--------------------+请注意 UnixDatagramServer 是派生自 UDPServer,而不是派生自 UnixStreamServer --- IP 和 Unix 流服务器的唯一区别地址族。 class socketserver.ForkingMixIn¶ class socketserver.ThreadingMixIn¶每种服务器类型的分叉和线程版本都可以使用这些混合类来创建。 例如,ThreadingUDPServer 的创建方式如下: class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass混合类先出现,因为它重载了 UDPServer 中定义的一个方法。 设置各种属性也会改变下层服务器机制的行为。 ForkingMixIn 和下文提及的分叉类仅在支持 fork() 的 POSIX 系统平台上可用。 socketserver.ForkingMixIn.server_close() 会等待直到所有子进程完成,除非 socketserver.ForkingMixIn.block_on_close 属性为假值。 socketserver.ThreadingMixIn.server_close() 会等待直到所有非守护类线程完成,除非 socketserver.ThreadingMixIn.block_on_close 属性为假值。 请将 ThreadingMixIn.daemon_threads 设为 True 来使用守护类线程以便不等待线完成。 在 3.7 版更改: socketserver.ForkingMixIn.server_close() 和 socketserver.ThreadingMixIn.server_close() 现在会等待直到所有子进程和非守护类线程完成。 请新增一个 socketserver.ForkingMixIn.block_on_close 类属性来选择 3.7 版之前的行为。 class socketserver.ForkingTCPServer¶ class socketserver.ForkingUDPServer¶ class socketserver.ThreadingTCPServer¶ class socketserver.ThreadingUDPServer¶这些类都是使用混合类来预定义的。 要实现一个服务,你必须从 BaseRequestHandler 派生一个类并重定义其 handle() 方法。 然后你可以通过组合某种服务器类型与你的请求处理句柄类来运行各种版本的服务。 请求处理句柄类对于数据报和流服务必须是不相同的。 这可以通过使用处理句柄子类 StreamRequestHandler 或 DatagramRequestHandler 来隐藏。 当然,你仍然需要动点脑筋! 举例来说,如果服务包含可能被不同请求所修改的内存状态则使用分叉服务器是没有意义的,因为在子进程中的修改将永远不会触及保存在父进程中的初始状态并传递到各个子进程。 在这种情况下,你可以使用线程服务器,但你可能必须使用锁来保护共享数据的一致性。 另一方面,如果你是在编写一个所有数据保存在外部(例如文件系统)的 HTTP 服务器,同步类实际上将在正在处理某个请求的时候“失聪” -- 如果某个客户端在接收它所请求的所有数据时很缓慢这可能会是非常长的时间。 这时线程或分叉服务器会更为适用。 在某些情况下,合适的做法是同步地处理请求的一部分,但根据请求数据在分叉的子进程中完成处理。 这可以通过使用一个同步服务器并在请求处理句柄类 handle() 中进行显式分叉来实现。 还有一种可以在既不支持线程也不支持 fork() 的环境(或者对于本服务来说这两者开销过大或是不适用)中处理多个同时请求的方式是维护一个显式的部分完成的请求表并使用 selectors 来决定接下来要处理哪个请求(或者是否要处理一个新传入的请求)。 这对于流服务来说特别重要,因为每个客户端可能会连接很长的时间(如果不能使用线程或子进程)。 请参阅 asyncore 来了解另一种管理方式。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |