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刷投票的脚本实现代码
Nov 08 Python
python实现颜色空间转换程序(Tkinter)
Dec 31 Python
python 打印对象的所有属性值的方法
Sep 11 Python
Python中py文件转换成exe可执行文件的方法
Jun 14 Python
python基于paramiko将文件上传到服务器代码实现
Jul 08 Python
Python Web框架之Django框架cookie和session用法分析
Aug 16 Python
初次部署django+gunicorn+nginx的方法步骤
Sep 11 Python
Python 异步协程函数原理及实例详解
Nov 13 Python
Django ModelForm操作及验证方式
Mar 30 Python
PyTorch预训练Bert模型的示例
Nov 17 Python
在python中对于bool布尔值的取反操作
Dec 11 Python
简述python四种分词工具,盘点哪个更好用?
Apr 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
yii使用activeFileField控件实现上传文件与图片的方法
2015/12/28 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
js parsefloat parseint 转换函数
2010/01/21 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
2012/01/03 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
JS解析XML实例分析
2015/01/30 Javascript
javascript搜索框效果实现方法
2015/05/14 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
2015/07/01 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
jQuery EasyUI Dialog拖不下来如何解决
2015/09/28 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
2016/02/01 Javascript
BootStrap中Tab页签切换实例代码
2016/05/30 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
详解webpack自定义loader初探
2018/08/29 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
Vue单文件组件开发实现过程详解
2020/07/30 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
详解Python中的Descriptor描述符类
2016/06/14 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
Win10下python3.5和python2.7环境变量配置教程
2018/09/18 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
python实现把两个二维array叠加成三维array示例
2019/11/29 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
2020/02/18 Python
python 在sql语句中使用%s,%d,%f说明
2020/06/06 Python
TensorFlow-gpu和opencv安装详细教程
2020/06/30 Python
python 使用递归的方式实现语义图片分割功能
2020/07/16 Python
删除pycharm鼠标右键快捷键打开项目的操作
2021/01/16 Python
美国电视购物HSN官网:HSN
2016/09/07 全球购物
大专自我鉴定范文
2013/10/23 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
2014年小学安全工作总结
2014/12/04 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书
浅谈MySQL user权限表
2021/06/18 MySQL