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中的super用法详解
May 28 Python
python计算一个序列的平均值的方法
Jul 11 Python
Python中关键字nonlocal和global的声明与解析
Mar 12 Python
python读写json文件的简单实现
Apr 11 Python
Python爬虫实现百度图片自动下载
Feb 04 Python
python线程池threadpool实现篇
Apr 27 Python
python爬虫之urllib库常用方法用法总结大全
Nov 14 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
Feb 26 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
Keras自动下载的数据集/模型存放位置介绍
Jun 19 Python
Keras中的两种模型:Sequential和Model用法
Jun 27 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
用Simple Excel导出xls实现方法
2012/12/06 PHP
PHP学习笔记之字符串编码的转换和判断
2014/05/22 PHP
PHP根据传入参数合并多个JS和CSS文件的简单实现
2014/06/13 PHP
浅析PHP中strlen和mb_strlen的区别
2014/08/31 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
2007/07/21 Javascript
Javascript UrlDecode函数代码
2010/01/09 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
javascript 原型链维护和继承详解
2014/11/26 Javascript
JavaScript实现的一个日期格式化函数分享
2014/12/06 Javascript
简介JavaScript中Boolean.toSource()方法的使用
2015/06/05 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
js中class的点击事件没有效果的解决方法
2016/10/13 Javascript
Bootstrap3 内联单选和多选框
2016/12/29 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
js模块加载方式浅析
2017/08/12 Javascript
layui 给数据表格加序号的方法
2018/08/20 Javascript
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
在Python上基于Markov链生成伪随机文本的教程
2015/04/17 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
2017/03/16 Python
python发送邮件脚本
2018/05/22 Python
python散点图实例之随机漫步
2018/08/27 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
pycharm中import呈现灰色原因的解决方法
2020/03/04 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
Python3爬虫mitmproxy的安装步骤
2020/07/29 Python
NOTINO英国:在线购买美容和香水
2020/02/25 全球购物
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
党员公开承诺事项
2014/03/25 职场文书
白血病捐款倡议书
2014/05/14 职场文书
通信工程专业求职信
2014/06/04 职场文书
创先争优活动承诺书
2014/08/30 职场文书
2015年园林绿化工作总结
2015/05/23 职场文书
公司财务管理制度
2015/08/04 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL