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登录豆瓣并发帖的方法
Jul 08 Python
python如何将图片转换为字符图片
Aug 19 Python
Tensorflow卷积神经网络实例进阶
May 24 Python
python进行两个表格对比的方法
Jun 27 Python
使用pycharm设置控制台不换行的操作方法
Jan 19 Python
Python中的正则表达式与JSON数据交换格式
Jul 03 Python
详解python中的time和datetime的常用方法
Jul 08 Python
详解Python3 pandas.merge用法
Sep 05 Python
Python中格式化字符串的四种实现
May 26 Python
详解Python 中的 defaultdict 数据类型
Feb 22 Python
python 如何在测试中使用 Mock
Mar 01 Python
基于PyQt5制作一个群发邮件工具
Apr 08 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水印
2007/03/16 PHP
js下通过getList函数实现分页效果的代码
2010/09/17 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
实现React单页应用的方法详解
2016/08/02 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
2016/10/26 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
微信小程序云开发实现增删改查功能
2019/05/17 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
javascript实现扫雷简易版
2020/08/18 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
Python文件及目录操作实例详解
2015/06/04 Python
python文件写入write()的操作
2019/05/14 Python
Python 运行.py文件和交互式运行代码的区别详解
2019/07/02 Python
django获取from表单multiple-select的value和id的方法
2019/07/19 Python
python队列原理及实现方法示例
2019/11/27 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
Python中logging日志库实例详解
2020/02/19 Python
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
打架检讨书50字
2014/01/11 职场文书
秋季运动会稿件
2014/01/30 职场文书
便利店投资创业计划书
2014/02/08 职场文书
英语专业职业生涯规划范文
2014/03/05 职场文书
护士毕业实习感言
2014/03/05 职场文书
如何写好建议书
2014/03/13 职场文书
给校长的建议书600字
2014/05/15 职场文书
社团活动总结格式
2014/08/29 职场文书
部门优秀员工推荐信
2015/03/24 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
老人院义工活动感想
2015/08/07 职场文书
辞职信怎么写?
2019/05/21 职场文书
JavaScript的function函数详细介绍
2021/11/20 Javascript