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 相关文章推荐
Windows下python3.6.4安装教程
Jul 31 Python
pycharm安装和首次使用教程
Aug 27 Python
使用11行Python代码盗取了室友的U盘内容
Oct 23 Python
Python调用C语言的实现
Jul 26 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
Aug 02 Python
python使用Matplotlib改变坐标轴的默认位置
Oct 18 Python
Python如何实现动态数组
Nov 02 Python
matlab灰度图像调整及imadjust函数的用法详解
Feb 27 Python
通过实例了解python__slots__使用方法
Sep 14 Python
让你相见恨晚的十个Python骚操作
Nov 18 Python
用OpenCV进行年龄和性别检测的实现示例
Jan 29 Python
Keras多线程机制与flask多线程冲突的解决方案
May 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
PHP的开合式多级菜单程序
2006/10/09 PHP
一个好用的分页函数
2006/11/16 PHP
php中利用post传递字符串重定向的实现代码
2011/04/21 PHP
PHP实现批量上传单个文件
2015/12/29 PHP
JS Array对象入门分析
2008/10/30 Javascript
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
javascript判断iphone/android手机横竖屏模式的函数
2011/12/20 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
js显示文本框提示文字的方法
2015/05/07 Javascript
jqGrid中文文档之选项设置
2015/12/02 Javascript
基于jquery实现简单的分页控件
2016/03/17 Javascript
Bootstrap carousel轮转图的使用实例详解
2016/05/17 Javascript
原生JavaScript编写canvas版的连连看游戏
2016/05/29 Javascript
js判断浏览器是否支持严格模式的方法
2016/10/04 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
深入Vue-Router路由嵌套理解
2018/08/13 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
JS求解两数之和算法详解
2020/04/28 Javascript
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
python GUI实现小球满屏乱跑效果
2019/05/09 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
利用python+request通过接口实现人员通行记录上传功能
2021/01/13 Python
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
社区志愿者心得体会
2014/01/03 职场文书
双拥工作宣传标语
2014/06/26 职场文书
机电一体化专业求职信
2014/07/22 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
机关职员工作检讨书
2014/10/23 职场文书
班主任工作实习计划
2015/01/16 职场文书
酒店客房服务员岗位职责
2015/04/09 职场文书
爱护环境建议书
2015/09/14 职场文书
oracle数据库去除重复数据
2022/05/20 Oracle
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript