Bootstrap

python封装rpc服务,代码示例

一、介绍

rpc服务类似于http服务,只是rpc为长连接,减少了每次建立连接前的三次握手,理论上效率会更高,两者之间具体的差异,这里就不再介绍了,可自行去查阅资料。

二、封装rpc服务

注:python2和python3中模块名是不一样的:
python2中: 模块名为:SimpleXMLRPCServer
python3中: 模块名为:xmlrpc
这两个模块都是python内置模块,无需另外安装,使用方便快捷

可参考模块官方文档:https://docs.python.org/zh-cn/3.6/library/xmlrpc.server.html#module-xmlrpc.server
可自行切换版本对比差异

以下代码示例主要以python3为主

1.rpc服务端示例

rpc服务端的创建:
最常用的为如下两个函数:
register_instance: 注册实例,主要是注册实例化对象
register_function:注册函数,可注册自定义函数,也可注册python自带的函数,如:sum,pow等
其它方法请自行参考官方文档(链接在上面)
具体代码如下:

# rpc服务端的创建
from xmlrpc.server import SimpleXMLRPCServer

def test1():
    return "test"

def test2(num1, num2):
    return num1 + num2

class Demo(object):
    def demo1(self):
        return "demo"

    def demo2(self, num1, num2):
        return num1 * num2

server = SimpleXMLRPCServer(("127.0.0.1", 8080))  # 初始化服务端
server.register_instance(Demo())  # 注册实例
server.register_function(test1)  # 注册函数
server.register_function(test2)
server.serve_forever()  # 保持等待调用状态

rpc客户端的创建
客户端的ip,端口需要和服务端一致,简单点理解可以把服务端理解为一个api接口,客户端去调用此接口,只是调用方式有一定差异。
客户端代码如下:

# 客户端
import xmlrpc.client

cli = xmlrpc.client.ServerProxy("http://127.0.0.1:8080")
print(cli.test1())  # 输出结果为:test
print(cli.test2(12))  # 输出结果为:3,和输入参数有关
print(cli.demo1())  # 输出结果为:demo
print(cli.demo2(2, 3))  # 输出结果为:6, 和输入参数有关

基本代码使用就是如上。
但,不知道你们是否有这样的疑问:如果类中定义的函数名和自己定义的函数名同名怎么办?
首先,运行是不会报错,都能正常运行的。
只是优先会使用注册的函数。在写bug时注意这个细节!

;