python中使用rpc框架

python官方库自带框架:SimpleXMLRPCServer,使用的http协议,xml格式,数据包大,速度慢

第三方框架:ZeroRPC(底层使用ZeroMQ和MessagePack,使用的tcp协议,速度快,响应时间短,并发高),grpc(谷歌推出支持跨语言)


1 SimpleXMLRPCServer使用

服务端

from xmlrpc.server import SimpleXMLRPCServer
class RPCServer(object):
    def __init__(self):
        super(RPCServer, self).__init__()
        print(self)
        self.send_data = {'server:'+str(i): i for i in range(100)}
        self.recv_data = None

    def getObj(self):
        print('get data')
        return self.send_data

    def sendObj(self, data):
        print('send data')
        self.recv_data = data
        print(self.recv_data)
        
# SimpleXMLRPCServer
server = SimpleXMLRPCServer(('localhost',4242), allow_none=True) # 服务端监听ip和端口
server.register_introspection_functions()              
server.register_instance(RPCServer())                            # 把类的对象传过来,如果写的是函数,传函数内存地址
server.serve_forever()                                           # 服务端一直启动

客户端

import time
from xmlrpc.client import ServerProxy

# SimpleXMLRPCServer
def xmlrpc_client():
    print('xmlrpc client')
    c = ServerProxy('http://localhost:4242')  # 拿到一个客户端
    data = {'client:'+str(i): i for i in range(100)}
    start = time.clock()
    for i in range(500):
        a=c.getObj()      # 调用的服务端的getobj方法,跟本地调用一样,有参数传参数,有返回值获取返回值
        print(a)
    for i in range(500):
        c.sendObj(data)   # 调用的服务端的sendobj方法
    print('xmlrpc total time %s' % (time.clock() - start))

if __name__ == '__main__':
    xmlrpc_client()

 

2 ZeroRPC使用

pip3 install zerorpc

服务端

import zerorpc

class RPCServer(object):
    def __init__(self):
        super(RPCServer, self).__init__()
        print(self)
        self.send_data = {'server:'+str(i): i for i in range(100)}
        self.recv_data = None

    def getObj(self):
        print('get data')
        return self.send_data

    def sendObj(self, data):
        print('send data')
        self.recv_data = data
        print(self.recv_data)
        
# zerorpc
s = zerorpc.Server(RPCServer())
s.bind('tcp://0.0.0.0:4243')
s.run()

 客户端

import zerorpc
import time

# zerorpc
def zerorpc_client():
    print('zerorpc client')
    c = zerorpc.Client()
    c.connect('tcp://127.0.0.1:4243')
    data = {'client:'+str(i): i for i in range(100)}
    start = time.clock()
    for i in range(500):
        a=c.getObj()
        print(a)
    for i in range(500):
        c.sendObj(data)

    print('total time %s' % (time.clock() - start))

if __name__ == '__main__':
    zerorpc_client()

 

posted @ 2022-11-10 11:14  不会钓鱼的猫  阅读(342)  评论(0编辑  收藏  举报