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 相关文章推荐
通过C++学习Python
Jan 20 Python
高效测试用例组织算法pairwise之Python实现方法
Jul 19 Python
使用python实现链表操作
Jan 26 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
Apr 26 Python
pandas.loc 选取指定列进行操作的实例
May 18 Python
Python面向对象之类和对象实例详解
Dec 10 Python
Python线程池模块ThreadPoolExecutor用法分析
Dec 28 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
Jul 25 Python
Python绘制组合图的示例
Sep 18 Python
Python 文本滚动播放器的实现代码
Apr 25 Python
Django与数据库交互的实现
Jun 03 Python
opencv读取视频并保存图像的方法
Jun 04 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 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
php多用户读写文件冲突的解决办法
2013/11/06 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
2017/05/05 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
PHP命名空间namespace及use的简单用法分析
2018/08/03 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
Javascript 设计模式(二) 闭包
2010/05/26 Javascript
jQuery学习总结之元素的相对定位和选择器(持续更新)
2011/04/26 Javascript
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
基于datagrid框架的查询
2013/04/08 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
基于JavaScript实现前端文件的断点续传
2016/10/17 Javascript
JS使用正则截取两个字符串之间的字符串实现方法详解
2017/01/06 Javascript
基于jQuery实现数字滚动效果
2017/01/16 Javascript
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
2018/10/29 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
JavaScript实现与web通信的方法详解
2020/08/07 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
Python学习笔记(二)基础语法
2014/06/06 Python
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
pygame实现飞机大战
2020/03/11 Python
解决echarts中饼图标签重叠的问题
2020/05/16 Python
Python连接Mysql进行增删改查的示例代码
2020/08/03 Python
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
Java servlet面试题
2012/03/04 面试题
国际商务系学生个人的自我评价
2013/11/26 职场文书
党员个人思想汇报
2013/12/28 职场文书
部队学习十八大感言
2014/01/11 职场文书
国企干部对照检查材料
2014/08/22 职场文书
2014年教师学期工作总结
2014/11/08 职场文书
停课通知书
2015/04/24 职场文书
python实现股票历史数据可视化分析案例
2021/06/10 Python