Thriftpy源代码走读(三)-服务器端流程分析

来源:互联网 发布:学编程需要什么条件 编辑:程序博客网 时间:2024/06/11 23:21

一、简述

本文将根据创建一个服务器端的基本流程,从make_server和serve方法入手,对Thriftpy如何构建一个服务器进行一个简单的分析

二、服务器端主要代码分析

  • make_server方法
    从代码中我们可以看出该方法主要分为三部分
    • TProcessor初始化
    • 服务器套接字初始化(TServerSocket/TSSLServerSocket)
    • 创建server对象实例(TThreadedServer)
def make_server(service, handler,                host="localhost", port=9090, unix_socket=None,                proto_factory=TBinaryProtocolFactory(),                trans_factory=TBufferedTransportFactory(),                client_timeout=3000, certfile=None):    processor = TProcessor(service, handler)    if unix_socket:        server_socket = TServerSocket(unix_socket=unix_socket)        if certfile:            warnings.warn("SSL only works with host:port, not unix_socket.")    elif host and port:        if certfile:            server_socket = TSSLServerSocket(                host=host, port=port, client_timeout=client_timeout,                certfile=certfile)        else:            server_socket = TServerSocket(                host=host, port=port, client_timeout=client_timeout)    else:        raise ValueError("Either host/port or unix_socket must be provided.")    server = TThreadedServer(processor, server_socket,                             iprot_factory=proto_factory,                             itrans_factory=trans_factory)    return server
  • TProcessor
class TProcessor(object):    def __init__(self, service, handler):        self._service = service        self._handler = handler    def process_in(self, iprot):        # 该方法主要执行以下工作        # 1.读取客户端请求,分析得到客户端调用的方法        # 2.判断service是否支持客户端调用的方法,如果不支持则抛出"未知方法"异常        # 3.读取客户端调用参数并将参数和服务器端的方法绑定后返回(call方法)        ......    def send_exception(self, oprot, api, exc, seqid):        # 向客户端发送异常信息        ......    def send_result(self, oprot, api, result, seqid):        # 向客户端发送执行结果        ......    def handle_exception(self, e, result):        # 如果call方法执行异常则进行进一步的判断处理        ......    def process(self, iprot, oprot):        # 该方法主要执行以下工作        # 1.调用process_in方法,发生异常则将异常信息发送给客户端        # 2.执行process_in方法返回的call方法        # 3.如果方法为oneway方法则处理结束,否则发送执行结果给客户端        ......
  • TServerSocket
class TServerSocket(object):    """Socket implementation for server side."""    def __init__(self, host=None, port=None, unix_socket=None,                 socket_family=socket.AF_INET, client_timeout=3000,                 backlog=128):        # 保存套接字相关参数        ......            def _init_sock(self):        # 根据__init__方法中指定的参数完成套接字初始化设置        ......    def listen(self):        # 调用_init_sock方法完成套接字初始化设置        # 将套接字绑定到指定地址并开始监听        ......    def accept(self):        # 调用套接字本身的accept方法,接受客户的连接        # 将每一个客户端连接封装成TSock对象        # 返回TSock对象        ......    def close(self):        # 关闭套接字        ......
  • TThreadedServer
class TThreadedServer(TServer):    """Threaded server that spawns a new thread per each connection."""    def __init__(self, *args, **kwargs):        # 初始化变量: 设置processor(TProcessor实例)/服务器套接字(TServerSocket实例)/传输层工厂类/协议层工厂类        ......    def serve(self):        # 调用服务器套接字的listen方法开始监听客户端请求        # 设置while循环持续处理客户端请求(直至close标志为True)        # while循环内部执行以下操作:        #   1.调用服务器套接字的accept方法获取客户端实例        #   2.创建一个线程,将该客户端实例交由handle方法处理        ......    def handle(self, client):        # 通过传输层工厂类和协议层工厂类将客户端实例进行封装        # 调用processor的process方法对该客户端实例(经过封装)进行处理        ......    def close(self):        # 设置close标记,以便serve方法及时退出        ......
  • serve方法
    详见TThreadedServer serve方法

三、小结

  • 通过以上分析,我们对创建服务器端的基本流程和服务器端框架有了一个大致的了解,如果在使用的过程中遇到问题,也能够很快的定位问题,找到关键代码
原创粉丝点击