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下使Python2.x版本的解释器与3.x共存的方法
Oct 25 Python
python的else子句使用指南
Feb 27 Python
Python多层嵌套list的递归处理方法(推荐)
Jun 08 Python
Python PyQt5实现的简易计算器功能示例
Aug 23 Python
Python动态导入模块的方法实例分析
Jun 28 Python
详解通过API管理或定制开发ECS实例
Sep 30 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 Python
python yield关键词案例测试
Oct 15 Python
Python全局锁中如何合理运用多线程(多进程)
Nov 06 Python
Python关键字及可变参数*args,**kw原理解析
Apr 04 Python
什么是Python中的顺序表
Jun 02 Python
Python新手学习函数默认参数设置
Jun 03 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
Look And Say 序列php实现代码
2011/05/22 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
2014/04/09 PHP
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
jquery制作多功能轮播图插件
2015/04/02 Javascript
针对JavaScript中this指向的简单理解
2016/08/26 Javascript
vue项目中应用ueditor自定义上传按钮功能
2018/04/27 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
javascript将非数值转换为数值
2018/09/13 Javascript
微信小程序实现图片上传
2019/05/23 Javascript
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
python读写文件操作示例程序
2013/12/02 Python
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
深入理解Python中的super()方法
2017/11/20 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
详解python实现可视化的MD5、sha256哈希加密小工具
2020/09/14 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
用CSS3的box-reflect设置文字倒影效果的方法讲解
2016/03/07 HTML / CSS
html5教程调用绘图api画简单的圆形代码分享
2013/12/04 HTML / CSS
HTML5的新特性(1)
2016/03/03 HTML / CSS
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
Hobbs官方网站:英国奢华女性时尚服装
2020/02/22 全球购物
数据库连接池的工作原理
2012/09/26 面试题
电大学习个人自我评价范文
2013/10/04 职场文书
幼儿园园长自我鉴定
2013/10/22 职场文书
联谊活动策划书
2014/01/26 职场文书
2014年大学生四年规划书范文
2014/04/03 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
简单租房协议书范本
2014/08/20 职场文书
四风查摆问题及整改措施
2014/10/10 职场文书
党的作风建设心得体会
2014/10/22 职场文书
一年级语文下册复习计划
2015/01/17 职场文书
高中班主任心得体会
2016/01/07 职场文书
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
2021/06/22 Python