BaseServer
类变量:timeout
实例变量:address RequestHandlerClass event close_flag
启动服务器
# 启动服务器的两种选择
# 1、一次调用一次handle_request
# 2、直接调用serve_forver
启动服务器前先清除event,循环判断close_flag为假时,不断调用select(默认poll_interval:0.5s,且会捕捉系统抛出的EINTR异常并忽略掉),在自身可读时调用非阻塞处理函数。
非阻塞处理函数
get_request 未实现
verify_request 默认True
process_request
调用 finish_request 并在其中调用 RequestHandlerClass(request, client_address, self)
调用shutdown_request 并在其中调用close_request
在整个处理中捕获异常并调用handle_error shutdown_request
TCPServer(BaseServer)
类变量:address_family socket_type request_queue_size(5) allow_reuse_address(False)
实例变量:address RequestHandlerClass socket bind_and_activate(若设置会在构造时进行bind和listen)
get_request
即为socket的accept,接收一个连接
shutdown_request
即为socket的shutdown,且最终调用close
close_request
即为socket的close
UDPServer(TCPServer)
类变量:allow_reuse_address socket_type max_packet_size
get_request
即为socket的recvfrom
MixIn
ForkingMixIn:
类变量:timeout active_children(set) max_children
process_request
先收集已退出的子进程
调用fork
父进程中加入pid到active_children并close
子进程中调用finish_request shutdown_request,且在调用过程中捕获异常
ThreadingMixIn:
类变量:daemon_threads = False
process_request
创建一个线程并设置是否为daemon_threads,之后启动。
接收变量为request client_address,正常处理流程。
Handler
BaseRequestHandler
handler中流程:init setup handle finish
获得的参数:request client_address server
用户需要派生各类handler并提供handle方法即可