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脚本来实现最简单的FTP下载的教程
May 04 Python
基python实现多线程网页爬虫
Sep 06 Python
python paramiko模块学习分享
Aug 23 Python
浅谈python日志的配置文件路径问题
Apr 28 Python
python selenium 对浏览器标签页进行关闭和切换的方法
May 21 Python
Python判断变量名是否合法的方法示例
Jan 28 Python
Python configparser模块常用方法解析
May 22 Python
python json.dumps() json.dump()的区别详解
Jul 14 Python
如何用python批量调整视频声音
Dec 22 Python
python 将html转换为pdf的几种方法
Dec 29 Python
Python Socket编程详解
Apr 25 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 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/11 PHP
Yii2框架实现数据库常用操作总结
2017/02/08 PHP
PHP封装curl的调用接口及常用函数详解
2018/05/31 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
2013/06/24 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
vue实现手机号码抽奖上下滚动动画示例
2017/10/18 Javascript
Vue封装的可编辑表格插件方法
2018/08/28 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
python回调函数用法实例分析
2015/05/09 Python
python开发之函数定义实例分析
2015/11/12 Python
python中的字典使用分享
2016/07/31 Python
给你选择Python语言实现机器学习算法的三大理由
2017/11/15 Python
python线程中同步锁详解
2018/04/27 Python
Python随机生成身份证号码及校验功能
2018/12/04 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
python给list排序的简单方法
2020/12/10 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
State Cashmere官网:半零售价可持续蒙古羊绒
2020/02/26 全球购物
计算机应用专业推荐信
2013/11/13 职场文书
酒店销售主管岗位职责
2014/01/04 职场文书
有关打架的检讨书
2014/01/25 职场文书
小王子读书笔记
2015/06/29 职场文书
诚信高考倡议书
2019/06/24 职场文书
一篇带你入门Java垃圾回收器
2021/06/16 Java/Android
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
vue自定义右键菜单之全局实现
2022/04/09 Vue.js
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python