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语法快速入门指南
Oct 12 Python
python开发之字符串string操作方法实例详解
Nov 12 Python
python+matplotlib绘制3D条形图实例代码
Jan 17 Python
使用Python和xlwt向Excel文件中写入中文的实例
Apr 21 Python
Python中偏函数用法示例
Jun 07 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
Jul 06 Python
如何基于python操作excel并获取内容
Dec 24 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
Jan 04 Python
python 中的[:-1]和[::-1]的具体使用
Feb 13 Python
Python 3.8 新功能来一波(大部分人都不知道)
Mar 11 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
Jun 15 Python
基于python实现银行管理系统
Apr 20 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
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
php常用Output和ptions/Info函数集介绍
2013/06/19 PHP
PHP中常见的缓存技术实例分析
2015/09/23 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
JavaScript中的原型链prototype介绍
2014/12/30 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
原生js实现图片轮播特效
2015/12/18 Javascript
基于Bootstrap重置输入框内容按钮插件
2016/05/12 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
用Vue.js实现监听属性的变化
2016/11/17 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
自制简易打赏功能的实例
2017/09/02 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
Vue 项目代理设置的优化
2018/04/17 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
2018/07/27 Javascript
Vue.js点击切换按钮改变内容的实例讲解
2018/08/22 Javascript
windows实现npm和cnpm安装步骤
2019/10/24 Javascript
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
jquery更改元素属性attr()方法操作示例
2020/05/22 jQuery
vue实现五子棋游戏
2020/05/28 Javascript
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
Python3实现连接SQLite数据库的方法
2014/08/23 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
2018/08/03 Python
python同时替换多个字符串方法示例
2019/09/17 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
W3C公布最新的HTML5标准草案
2008/10/17 HTML / CSS
详解html5 canvas 微信海报分享(个人爬坑)
2018/01/12 HTML / CSS
伦敦高达60%折扣的钻石珠宝商:Purely Diamonds
2018/06/24 全球购物
模具专业推荐信
2013/10/30 职场文书
《庐山的云雾》教学反思
2014/04/22 职场文书
火锅店的活动方案
2014/08/15 职场文书
民主生活会对照检查材料
2014/09/22 职场文书
先进班集体事迹材料
2014/12/25 职场文书
酒店厨房管理制度
2015/08/06 职场文书
导游词之无锡东林书院
2019/12/11 职场文书
在CSS中使用when/else的方法
2022/01/18 HTML / CSS