Python使用RPC例子

作者:伍迪艾伦学Python 时间:2021-04-11 23:26:51 

主要内容

所谓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()

来源:https://blog.csdn.net/pppython123/article/details/124239809

标签:Python,RPC
0
投稿

猜你喜欢

  • python 多进程和多线程使用详解

    2021-08-12 19:50:43
  • PHP使用flock实现文件加锁的方法

    2023-10-29 21:26:59
  • 利用 PyCharm 实现本地代码和远端的实时同步功能

    2022-03-05 08:54:10
  • 如何理解python中数字列表

    2023-01-30 13:29:09
  • Python深度学习pytorch神经网络多层感知机简洁实现

    2021-08-20 17:37:43
  • Python中使用Inotify监控文件实例

    2021-03-03 14:17:05
  • python Opencv实现停车位识别思路详解

    2023-10-20 21:54:25
  • python Selenium 库的使用技巧

    2021-08-07 21:23:47
  • 详解python3中的真值测试

    2022-03-10 13:56:59
  • python实现堆栈与队列的方法

    2023-06-19 02:57:04
  • Go 结构体、数组、字典和 json 字符串的相互转换方法

    2024-05-05 09:26:42
  • 详解Python3 对象组合zip()和回退方式*zip

    2021-03-01 11:14:09
  • Python如何实现远程方法调用

    2022-11-11 20:42:15
  • Python在字典中查找元素的3种方式

    2023-08-07 21:33:35
  • VB.NET调用MySQL存储过程并获得返回值的方法

    2024-01-12 16:03:45
  • 两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法

    2023-06-25 12:44:15
  • 使用keras内置的模型进行图片预测实例

    2021-12-27 17:54:29
  • Web标准的web UI

    2008-01-02 12:34:00
  • ASP进阶教程Ⅶ:留言簿设置密码验证

    2008-10-13 09:02:00
  • 支持png透明图片的php生成缩略图类分享

    2023-11-18 07:26:13
  • asp之家 网络编程 m.aspxhome.com