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实现的解析crontab配置文件代码
Jun 30 Python
一步步教你用Python实现2048小游戏
Jan 19 Python
python 函数传参之传值还是传引用的分析
Sep 07 Python
使用Python爬取最好大学网大学排名
Feb 24 Python
Python中staticmethod和classmethod的作用与区别
Oct 11 Python
基于python指定包的安装路径方法
Oct 27 Python
python画图系列之个性化显示x轴区段文字的实例
Dec 13 Python
Tensorflow中的降维函数tf.reduce_*使用总结
Apr 20 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
TensorFlow固化模型的实现操作
May 26 Python
Django路由层URLconf作用及原理解析
Sep 24 Python
python UIAutomator2使用超详细教程
Feb 19 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
mysql 搜索之简单应用
2007/04/27 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
php多个文件及图片上传实例详解
2014/11/10 PHP
php更新mysql后获取改变行数的方法
2014/12/25 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
2017/07/27 PHP
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
jquery序列化方法实例分析
2015/06/10 Javascript
JAVA四种基本排序方法实例总结
2015/07/24 Javascript
jQuery实现大转盘抽奖活动仿QQ音乐代码分享
2015/08/21 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
js初始化验证实例详解
2016/11/26 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
如何获取元素的最终background-color
2017/02/06 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
[01:12]DOTA2 2015年秋季互动指南
2015/11/10 DOTA
python错误处理详解
2014/09/28 Python
Python实现telnet服务器的方法
2015/07/10 Python
python根据京东商品url获取产品价格
2015/08/09 Python
Python运行不显示DOS窗口的解决方法
2018/10/22 Python
python爬虫爬取微博评论案例详解
2019/03/27 Python
Python 根据日志级别打印不同颜色的日志的方法示例
2019/08/08 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
python实现银行实战系统
2020/02/26 Python
Django解决frame拒绝问题的方法
2020/12/18 Python
Urban Decay官方网站:美国化妆品品牌
2020/06/04 全球购物
物业招聘计划书
2014/01/10 职场文书
优秀导游先进事迹材料
2014/01/25 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
学习心理学心得体会
2016/01/22 职场文书
七年级作文之雪景
2019/11/18 职场文书
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL