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实现给字典添加条目的方法
Sep 25 Python
python使用正则表达式提取网页URL的方法
May 26 Python
Python中有趣在__call__函数
Jun 21 Python
Python作用域用法实例详解
Mar 15 Python
Python中使用asyncio 封装文件读写
Sep 11 Python
Python入门之三角函数全解【收藏】
Nov 08 Python
利用python库在局域网内传输文件的方法
Jun 04 Python
django 消息框架 message使用详解
Jul 22 Python
余弦相似性计算及python代码实现过程解析
Sep 18 Python
Python Pickle 实现在同一个文件中序列化多个对象
Dec 30 Python
Python如何实现在字符串里嵌入双引号或者单引号
Mar 02 Python
Python多线程多进程实例对比解析
Mar 12 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实现的MySQL数据浏览器
2007/03/11 PHP
IStream与TStream之间的相互转换
2008/08/01 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
Linux下PHP安装mcrypt扩展模块笔记
2014/09/10 PHP
javascript 二维数组的实现与应用
2010/03/16 Javascript
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
javascript之典型高阶函数应用介绍
2013/01/10 Javascript
jquery showModelDialog的使用方法示例详解
2013/11/19 Javascript
JavaScript中的对象的extensible属性介绍
2014/12/30 Javascript
jQuery延迟加载图片插件Lazy Load使用指南
2015/03/25 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
jquery获取复选框checkbox的值的简单实现方法
2016/05/26 Javascript
微信小程序 生命周期详解
2016/10/12 Javascript
使用BootStrap进行轮播图的制作
2017/01/06 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
2017/02/10 Javascript
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
es5 类与es6中class的区别小结
2020/11/09 Javascript
从0开始的Python学习014面向对象编程(推荐)
2019/04/02 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
解决pycharm安装第三方库失败的问题
2020/05/09 Python
Anaconda+vscode+pytorch环境搭建过程详解
2020/05/25 Python
python爬虫爬取图片的简单代码
2021/01/18 Python
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
Hunkemöller西班牙:欧洲最大的内衣连锁店
2018/08/15 全球购物
Java程序员常见面试题
2015/07/16 面试题
J2ee常用的设计模式?说明工厂模式
2015/05/21 面试题
部队领导证婚词
2014/01/12 职场文书
冰淇淋店的创业计划书
2014/02/07 职场文书
个人近期表现材料
2014/02/11 职场文书
简爱读书笔记
2015/06/26 职场文书
毕业典礼主持词
2015/06/29 职场文书
班干部学习委员竞选稿
2015/11/20 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
创业计划书之废品回收
2019/09/26 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers
Python爬虫之爬取某文库文档数据
2021/04/21 Python