主要内容
所谓RPC,是远程过程调用(Remote Procedure Call)的简写,网上解释很多,简单来说,就是在当前进程调用其他进程的函数时,体验就像是调用本地写的函数一般。
本文实现的是在本地调用远端的类class对象的接口,也就是本地的client不实例化类对象,调用的是server端的类对象接口。
为了达到让调用层无须关心底层实现,拥有丝滑般的体验,就需要以下几个部分:
- 客户端需要把类的接口提取出来,并将调用函数事件捕获存储起来;服务端需要把类的公有函数作为可远程调用的接口。
- 客户端把调用函数的事件(调用的函数,参数)进行序列化并发送给服务端;服务端将客户端的调用事件反序列化,并执行相应的接口,将返回值发送给客户端。
- 客户端与服务端通过某种方式(一般就是网络socket)进行通信。
远程过程调用RPC常用与分布式计算,对应Python库名为rpyc;
from multiprocessing import Pool
from rpyc import Service
from rpyc.utils.server import ThreadedServer
class RemoteService(Service):
def on_connect(self, conn):
print(conn)
'''供客户端调用的方法前得加exposed_'''
def exposed_search(self, data):
print(data)
data['result'] = 'ok'
return data
def main(port):
sr = ThreadedServer(service=RemoteService, hostname='127.0.0.1', port=port, auto_register=False)
print(f'Server IP: {(sr.host,sr.port)}')
sr.start()
if __name__ == '__main__':
pool = Pool(processes=2)
pool.apply_async(main, args=(9998,))
pool.apply_async(main, kwds={'port':9999})
pool.close()
pool.join()
上段为rpyc服务端,下段为rpyc调用端;
import rpyc
import time
from multiprocessing import Pool
def search_db(query,port):
conn = rpyc.connect('localhost',port)
'''调用时省略exposed_'''
result = conn.root.search(query)
time.sleep(1)
print(result)
conn.close()
if __name__ == '__main__':
pool = Pool(processes=2)
pool.apply_async(search_db, args=({"match": {'name': 'user'}}, 9998))
pool.apply_async(search_db, kwds={'query': {"match": {'name': 'user'}},'port':9999})
pool.close()
pool.join()
到此这篇关于Python使用RPC例子的文章就介绍到这了,更多相关Python使用RPC内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!