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分析git log日志示例
Feb 27 Python
python中xrange和range的区别
May 13 Python
跟老齐学Python之使用Python操作数据库(1)
Nov 25 Python
利用Python演示数型数据结构的教程
Apr 03 Python
Python可变参数函数用法实例
Jul 07 Python
Python协程的用法和例子详解
Sep 09 Python
Python利用heapq实现一个优先级队列的方法
Feb 03 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
Jun 04 Python
Python 监测文件是否更新的方法
Jun 10 Python
解决.ui文件生成的.py文件运行不出现界面的方法
Jun 19 Python
python列表,字典,元组简单用法示例
Jul 11 Python
python命名空间(namespace)简单介绍
Aug 10 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垃圾代码优化操作代码
2010/08/05 PHP
php多维数组去掉重复值示例分享
2014/03/02 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
phpwind放自动注册方法
2006/12/02 Javascript
js常用代码段收集
2011/10/28 Javascript
为JavaScript类型增加方法的实现代码(增加功能)
2011/12/29 Javascript
中文字符串截取的js函数代码
2013/04/17 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
2014/04/16 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
setTimeout学习小结
2017/02/08 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
js Math数学简单使用操作示例
2020/03/13 Javascript
详解vue组件之间的通信
2020/08/30 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
Python MD5文件生成码
2009/01/12 Python
跟老齐学Python之字典,你还记得吗?
2014/09/20 Python
python实现得到一个给定类的虚函数
2014/09/28 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
TensorFlow 滑动平均的示例代码
2018/06/19 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
Python for循环搭配else常见问题解决
2020/02/11 Python
python线程里哪种模块比较适合
2020/08/02 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
简短的公司员工自我评价分享
2013/11/13 职场文书
服装设计专业自荐书范文
2013/12/30 职场文书
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书
公司募捐倡议书
2014/05/14 职场文书
2014年稽查工作总结
2014/12/20 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技