体会Python之独具匠心:Python XML PRC server多线程实现及其原理

周末需要调研Python XMLRPC的一些性能问题,发现所说的XML RPC仅支持单线程。网上给出实现多线程的方法,最常见最简便的是继承 ThreadingMixIn ,代码给得很全,但是很少有地方说为什么这样可以实现。

因是python新手,所以不太理解,搜了一些资料,现在做整理。

实现的代码:
class RPCThreading(SocketServer.ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
    pass
global mutex
mutex =thread.allocate_lock()
server_object = Server()
server = RPCThreading(("localhost", 8888))
server.register_instance(server_object)

#Go into the main listener loop
print "Listening"
server.serve_forever()

RPCThreading这个类也可以这样声明
class RPCThreading(ThreadingMixIn, SimpleXMLRPCServer):
    pass
只要代码前端import的模块匹配就可以了。
看这个声明的格式,应该是RPCThreading这个自定义的类,继承了ThreadingMixIn和SimpleXMLRPCServer。
但是自定义方法部分直接pass,什么也没做。
然后server.serve_forever()就可以做到多线程了?
猜测应该是继承的这两个类之间发生一些关键函数的重写,比如前面一个类重写了后面一个类的run函数

参考http://docs.python.org/3.0/library/socketserver.html

Forking and threading versions of each type of server can be created using the ForkingMixIn(多进程) and ThreadingMixIn(多线程) mix-in classes. For instance, a threading UDP server class is created as follows:

class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass

The mix-in class must come firstsince it overrides a method defined in UDPServer. Setting the various member variables also changes the behavior of the underlying server mechanism.

由上面例子可知,能实现多线程(进程)版的server(UDP/TCP/XMLRPC都如此),是由于ThreadingMixIn(ForkingMixIn)类重写了server类中定义的方法。
找到定义ThreadingMixIn的py文件:
体会Python之独具匠心:Python <wbr>XML <wbr>PRC <wbr>server多线程实现及其原理
这里看到process_requst函数中定义了多线程,target指向process_request_thread

而process_request函数在BaseServer类中会被handler()调用,具体如下:
SimpleXMLRPCServer类继承自TCPServer类继承自BaseServer类,
BaseServer类定义了server_forever方法,其中调用了self._handle_request_noblock()方法,这个方法中又调用了self.process_request(request, client_address)
体会Python之独具匠心:Python <wbr>XML <wbr>PRC <wbr>server多线程实现及其原理
应该就是这里的process_request方法被ThreadingMixIn重写之后,变为多线程的方法,所以简单的一句:
class RPCThreading(ThreadingMixIn, SimpleXMLRPCServer):
    pass
就可以实现Server对象的多线程。
真相大白!
Python真的很神奇,匠心独具。
TSMaster PRC(这里假设是某种协议或机制的缩写)的具体定义和内容我无法得知,因为没有足够的背景信息。但是,我可以向你说明如何在Python实现一个通用的远程过程调用(RPC)机制。 在Python实现RPC机制通常涉及以下几个步骤: 1. **定义服务接口**:首先需要定义一组服务接口,这些接口规定了客户端可以调用哪些远程方法以及它们的参数和返回值。 2. **选择或创建通信协议**:确定远程过程调用之间的通信协议,例如HTTP REST、XML-RPC、JSON-RPC或者其他自定义协议。 3. **实现服务端(服务器)**:服务端需要实现上述定义的接口,同时还需要处理网络通信和请求的分发。Python中常用的网络库如`socket`、`http.server`、`flask`、`tornado`等可以用来实现服务端。 4. **实现客户端(调用者)**:客户端需要知道如何与服务端通信,包括网络地址、端口和协议格式。客户端使用这些信息调用远程方法,就像调用本地方法一样。 5. **数据序列化与反序列化**:在客户端和服务端之间传输的数据需要被序列化(编码)和反序列化(解码)。Python中常用的数据序列化格式有JSON、pickle、XML等。 6. **异常处理和错误管理**:在远程调用过程中,需要处理可能出现的网络异常和远程方法调用的错误。 以下是一个非常简单的基于HTTP协议的RPC示例: 服务端代码示例(使用Flask框架): ```python from flask import Flask, jsonify, request app = Flask(__name__) @app.route('/add', methods=['POST']) def add(): data = request.get_json() a = data['a'] b = data['b'] return jsonify({'result': a + b}) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) ``` 客户端代码示例: ```python import requests def add(a, b): response = requests.post('http://localhost:5000/add', json={'a': a, 'b': b}) return response.json()['result'] print(add(2, 3)) ``` 请注意,以上代码仅为示例,实际的TSMaster PRC机制可能有特定的实现细节和要求,需要根据具体的协议文档来实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值