Python远程方法调用实现过程解析


Posted in Python onJuly 28, 2020

RPCHandler 和 RPCProxy 的基本思路是很比较简单的。 如果一个客户端想要调用一个远程函数,比如 foo(1, 2, z=3) ,代理类创建一个包含了函数名和参数的元组 (‘foo', (1, 2), {‘z': 3}) 。 这个元组被pickle序列化后通过网络连接发生出去。 这一步在 RPCProxy 的 getattr() 方法返回的 do_rpc() 闭包中完成。

服务器接收后通过pickle反序列化消息,查找函数名看看是否已经注册过,然后执行相应的函数。 执行结果(或异常)被pickle序列化后返回发送给客户端。实例需要依赖 multiprocessing 进行通信。 不过,这种方式可以适用于其他任何消息系统。例如,如果你想在ZeroMQ之上实习RPC, 仅仅只需要将连接对象换成合适的ZeroMQ的socket对象即可。

先实现server端

import json
from multiprocessing.connection import Listener
from threading import Thread


class RPCHandler:
  def __init__(self):
    self._functions = {}

  def register_function(self, func):
    self._functions[func.__name__] = func

  def handle_connection(self, connection):
    try:
      while True:
        func_name, args, kwargs = json.loads(connection.recv())
        # Run the RPC and send a response
        try:
          r = self._functions[func_name](*args, **kwargs)
          connection.send(json.dumps(r))
        except Exception as e:
          connection.send(json.dumps(e))
    except EOFError:
      pass


def rpc_server(handler, address, authkey):
  sock = Listener(address, authkey=authkey)
  while True:
    client = sock.accept()
    t = Thread(target=handler.handle_connection, args=(client,))
    t.daemon = True
    t.start()
# Some remote functions
def add(x,y):
  return x+y


if __name__ == '__main__':
  handler = RPCHandler()
  handler.register_function(add)
  # Run the server
  rpc_server(handler, ('127.0.0.1', 17000), authkey=b'peekaboo')

再实现client端

import json
from multiprocessing.connection import Client


class RPCProxy:

  def __init__(self, connection):
    self._connection = connection

  def __getattr__(self, name):
    def do_rpc(*args, **kwargs):
      self._connection.send(json.dumps((name, args, kwargs)))
      result = json.loads(self._connection.recv())
      if isinstance(result, Exception):
        raise result
      return result

    return do_rpc
if __name__ == '__main__':
  c = Client(('127.0.0.1', 17000), authkey=b'peekaboo')
  proxy = RPCProxy(c)
  res = proxy.add(2, 3)
  print(res)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实例分享:快速查找出被挂马的文件
Jun 08 Python
总结Python中逻辑运算符的使用
May 13 Python
python通过pip更新所有已安装的包实现方法
May 19 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
Jul 24 Python
matplotlib 纵坐标轴显示数据值的实例
May 25 Python
浅谈python写入大量文件的问题
Nov 09 Python
python实现AES加密解密
Mar 28 Python
深入了解Python iter() 方法的用法
Jul 11 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
Dec 21 Python
Python 中 sorted 如何自定义比较逻辑
Feb 02 Python
python四种出行路线规划的实现
Jun 23 Python
详解非极大值抑制算法之Python实现
Jun 28 Python
Python 实现一个计时器
Jul 28 #Python
python爬虫要用到的库总结
Jul 28 #Python
Python常用类型转换实现代码实例
Jul 28 #Python
Python 如何创建一个线程池
Jul 28 #Python
matplotlib subplot绘制多个子图的方法示例
Jul 28 #Python
python爬虫用mongodb的理由
Jul 28 #Python
python爬虫数据保存到mongoDB的实例方法
Jul 28 #Python
You might like
世界咖啡生产者论坛呼吁:需要立即就咖啡价格采取认真行动
2021/03/06 咖啡文化
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
基于PHP实现假装商品限时抢购繁忙的效果
2015/10/16 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
PHP抽象类基本用法示例
2018/12/28 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
2019/02/15 PHP
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
2012/01/15 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
2017/04/10 jQuery
JS处理一些简单计算题
2018/02/24 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
node 版本切换的实现
2020/02/02 Javascript
在Python中操作字符串之replace()方法的使用
2015/05/19 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
python中从for循环延申到推导式的具体使用
2019/11/29 Python
python 中的命名空间,你真的了解吗?
2020/08/19 Python
浅谈HTML5 defer和async的区别
2016/06/07 HTML / CSS
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
展会邀请函范文
2014/01/26 职场文书
买卖协议书范本
2014/04/21 职场文书
2014教师专业技术工作总结
2014/12/03 职场文书
2014年社区工会工作总结
2014/12/18 职场文书
活动总结模板大全
2015/05/11 职场文书
2015团员个人年度总结
2015/11/24 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书
分析Java中Map的遍历性能问题
2021/06/26 Java/Android