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标准库中的wave模块绘制乐谱的简单教程
Mar 30 Python
python实现感知器
Dec 19 Python
Python自定义线程池实现方法分析
Feb 07 Python
Python机器学习算法之k均值聚类(k-means)
Feb 23 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
Jan 30 Python
python中eval与int的区别浅析
Aug 11 Python
Python获取一个用户名的组ID过程解析
Sep 03 Python
python 生成器和迭代器的原理解析
Oct 12 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
Jun 29 Python
Python调用C/C++的方法解析
Aug 05 Python
python不同版本的_new_不同点总结
Dec 09 Python
pytorch加载预训练模型与自己模型不匹配的解决方案
May 13 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
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
2019/12/04 PHP
JavaScript 特殊字符
2007/04/05 Javascript
异步加载script的代码
2011/01/12 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
2013/05/13 Javascript
js函数名与form表单元素同名冲突的问题
2014/03/07 Javascript
Google官方支持的NodeJS访问API,提供后台登录授权
2014/07/29 NodeJs
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
jQuery过滤选择器详解
2015/01/13 Javascript
jQuery实现简单二级下拉菜单
2015/04/12 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
AngularJS中比较两个数组是否相同
2016/08/24 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
vue实现拖拽效果
2019/12/23 Javascript
[01:28]2014DOTA2国际邀请赛中国区预选赛四大豪门直升机抵达会场
2014/05/24 DOTA
Python Sleep休眠函数使用简单实例
2015/02/02 Python
Python实现二分查找算法实例
2015/05/26 Python
python获取文件扩展名的方法
2015/07/06 Python
谈谈Python中的while循环语句
2019/03/10 Python
python读取.mat文件的数据及实例代码
2019/07/12 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
跨域修改iframe页面内容详解
2019/10/31 HTML / CSS
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
收银出纳员岗位职责
2014/02/23 职场文书
社团2014年植树节活动总结
2014/03/11 职场文书
小学师德师风整改措施
2014/10/27 职场文书
说谎欺骗人检讨书300字
2014/11/18 职场文书
关于运动会的广播稿
2015/08/19 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书
python 中的@运算符使用
2021/05/26 Python
Redis性能监控的实现
2021/07/09 Redis