返回顶部
首页 > 资讯 > 后端开发 > Python >基于python如何实现rpc远程过程调用
  • 259
分享到

基于python如何实现rpc远程过程调用

2023-07-02 09:07:47 259人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍“基于python如何实现rpc远程过程调用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Python如何实现rpc远程过程调用”文章能帮助大家解决问题。一、主要内容所谓RPC,

这篇文章主要介绍“基于python如何实现rpc远程过程调用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Python如何实现rpc远程过程调用”文章能帮助大家解决问题。

    一、主要内容

    所谓RPC,是远程过程调用(Remote Procedure Call)的简写,网上解释很多,简单来说,就是在当前进程调用其他进程的函数时,体验就像是调用本地写的函数一般。
    本文实现的是在本地调用远端的类class对象的接口,也就是本地的client不实例化类对象,调用的是server端的类对象接口。
    为了达到让调用层无须关心底层实现,拥有丝滑般的体验,就需要以下几个部分:

    • 客户端需要把类的接口提取出来,并将调用函数事件捕获存储起来;服务端需要把类的公有函数作为可远程调用的接口。

    • 客户端把调用函数的事件(调用的函数,参数)进行序列化并发送给服务端;服务端将客户端的调用事件反序列化,并执行相应的接口,将返回值发送给客户端。

    • 客户端与服务端通过某种方式(一般就是网络Socket)进行通信。

    在下面时序图的灰色部分,对于调用方来说是透明的,它的执行结果应该和执行本地的函数时一致的。

    基于python如何实现rpc远程过程调用

    二、实现步骤

    1. 进程间的通信

    本文采用了基于tcp的sokcet连接来进行进程之间的通信,更多实现细节可参考之前博客。
    在此需要注意:

    本文采用了select模块来监听网络事件,如果服务端未收到任何的网络消息会一直阻塞在这儿。如果服务端除了提供rpc调用服务之外还需要执行其他逻辑,那么应当采用非阻塞,轮询socket的方式来判断是否有新的网络事件。

    # ServerBase.pydef process(self):    readable, writable, exceptional = select.select(self.inputs, self.outputs, self.conns.values())    for conn in readable:        if conn is self.socket:            self._handle_conn()        else:            self._handle_recv(conn)    for conn in writable:        pass    for conn in exceptional:        self._handle_leave(conn)

    客户端的网络事件本文通过创建新的线程来监听的。并不会影响客户端主线程的执行,因此可以尽情的阻塞。部分代码如下:

    # AsynCallback.pyclass AsyncTaskManager(object):    _asy_events = dict()    def __init__(self, loop, *args):        super(AsyncTaskManager, self).__init__()        self._loop_fun = loop    def __call__(self, *args, **kwargs):        proc = threading.Thread(target=self._exec_loop, args=args, kwargs=kwargs)        proc.start()    def _exec_loop(self, *args, **kwargs):        while True:            net_resp = self._loop_fun(*args, **kwargs)            for resp in net_resp:                asy_event = self._asy_events.pop(resp.rid)                asy_event.set()
    # Client.pyclass Client(TaskHandle, ClientBase):    @AsyncTaskManager    def process(self):        super(Client, self).process()        _events = []        while self.has_events:            event = self.get_next_event()            data = event[1]            _events.append(self.unpack_respond(data))        return _events

    序列化方式,本文采用了库pickle进行序列化与反序列化,使用它的原因是可以将自定义类对象也进行序列化,非常之高级。

    2. 异步回调实现思路

    对于需要返回值的函数调用,处理起来比较简单,只需要将主线程阻塞等待,直至超时或者接收到了对应函数的返回值即可。本文采用了threading.Event来阻塞与唤醒调用的函数,同时采用了装饰器来实现这功能。若日后有更好的方法,可以轻易进行替换。相关示例代码如下所示:

    @AsyncTaskManager.responddef _handle_response(self, tid):    """ 处理有返回值的情况    会阻塞线程直至收到返回值    """    task = self.pop_task(tid)    if task.callback:        task.callback()    return self.pop_respond(tid)@staticmethoddef respond(func):    @wraps(func)    def make_resp(handle, tid):        """ 需要注意的是,和装饰的函数参数含义需一致 """        event = threading.Event()        AsyncTaskManager._asy_events[tid] = event        event.wait(timeout=TIME_OUT)        return func(handle, tid)    # 这儿才是真正执行_handle_response的地方    return make_resp

    在实际的应用过程中,应有这样的情况,服务端与客户端都是独立的应用,通过rpc函数进行通信和交互,而并不是某方为另外一方提供服务,那么此时返回值并不必要,只需要将要做的事通知另一方即可。对于此种情况,可以采用异步回调的方式来告知调用方对应函数执行成功了。

    在文中依旧采用线程来完成该功能,客户端调用函数之后创建一个新线程并阻塞住,等待服务端将执行结果发回后再唤醒,如果有回调函数就执行。示例代码如下:

    @AsyncTaskManager.callbackdef _handle_call_back(self, tid):    """ 处理有回调函数的调用    callback会等tid事件调用成功之后 才会回调,且不会有返回值    """    task = self.pop_task(tid)    if task.callback:        task.callback()        @staticmethoddef callback(func):    @wraps(func)    def make_thread(event, *args, **kwargs):        event.wait(timeout=TIME_OUT)        func(*args, **kwargs)    def make_async(handle, tid):        """ 注意点同上 """        event = threading.Event()        AsyncTaskManager._asy_events[tid] = event        _task = threading.Thread(target=lambda: make_thread(event, handle, tid))    return make_async

    关于“基于python如何实现rpc远程过程调用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网Python频道,小编每天都会为大家更新不同的知识点。

    --结束END--

    本文标题: 基于python如何实现rpc远程过程调用

    本文链接: https://lsjlt.com/news/340744.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • 基于python如何实现rpc远程过程调用
      这篇文章主要介绍“基于python如何实现rpc远程过程调用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于python如何实现rpc远程过程调用”文章能帮助大家解决问题。一、主要内容所谓RPC,...
      99+
      2023-07-02
    • 基于python实现rpc远程过程调用
      目录基于python实现RPC的demo前言一、主要内容二、实现步骤1. 进程间的通信2. 异步回调实现思路总结基于python实现RPC的demo 这是一个远程过程调用(RPC)的...
      99+
      2024-04-02
    • 远程过程调用RPC基本概念及实现原理
      >>什么是RPC RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。 它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程...
      99+
      2024-04-02
    • 如何在Python中实现一个简单的RPC远程过程调用框架
      如何在Python中实现一个简单的RPC远程过程调用框架在分布式系统中,一种常见的通信机制是通过RPC(Remote Procedure Call,远程过程调用)来实现不同进程之间的函数调用。RPC允许开发者像调用本地函数一样调用远程函数,...
      99+
      2023-10-27
      远程调用 Python RPC框架 实现RPC
    • 如何在PHP中实现RPC远程调用?
      随着互联网的快速发展和云计算技术的广泛应用,分布式系统和微服务架构变得越来越普遍。在这样的背景下,远程过程调用(RPC)成为了一种常见的技术手段。RPC能够使得不同的服务在网络上实现远程调用,从而实现不同服务之间的互联操作,提高代码的复用性...
      99+
      2023-05-14
      PHP rpc 远程调用
    • node.js中RPC(远程过程调用)的实现原理介绍
      刚接触到RPC(远程过程调用),就是可以在本地调用远程机子上的程序的方法,看到一个简单的nodejs实现,用来学习RPC的原理很不错:nodejs light_rpc 使用示例: //服务端 var l...
      99+
      2022-06-04
      原理 过程 node
    • 如何使用PHP和Swoole实现RPC远程调用
      如何使用PHP和Swoole实现RPC远程调用RPC(Remote Procedure Call)是一种远程调用的协议,可以让应用程序在不同计算机上进行函数调用。RPC通常被用于构建分布式系统,其可以让不同的微服务能够协同工作。在PHP和S...
      99+
      2023-05-14
      PHP rpc swoole
    • openstack中的rpc如何远程调用
      本篇内容介绍了“openstack中的rpc如何远程调用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是 RPC看不明白这个图对于看no...
      99+
      2023-06-20
    • golang实现简单rpc调用过程解析
      目录基本概念RPC通信过程RPC 具体实现server端客户端基本概念 RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务...
      99+
      2024-04-02
    • 通过 Redis 实现 RPC 远程方法调用(支持多种编程语言)
      我发现经常研究并且为之兴奋的一件事就是对系统进行扩展。现在这对不同的人有着不同的意思。作为移植Monolithic应用到Microservices架构方法中的一部分,如何处理Microservices架构是...
      99+
      2022-06-04
      编程语言 多种 方法
    • python使用SimpleXMLRPCServer实现简单的rpc过程
      目录使用SimpleXMLRPCServer实现rpc模块定义方法python与rpc服务1.什么是RPC2.xmlrp库使用SimpleXMLRPCServer实现rpc 模块 S...
      99+
      2024-04-02
    • python如何通过protobuf实现rpc
      由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc。rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行goog...
      99+
      2022-06-04
      python protobuf rpc
    • 基于IDEA 的远程调试 Weblogic的操作过程
      目录基于IDEA 的远程调试 Weblogic背景操作过程docker 相关配置IDEA 相关配置基于IDEA 的远程调试 Weblogic 使用环境 docker + vulhu...
      99+
      2024-04-02
    • springboot+HttpInvoke如何实现RPC调用
      小编给大家分享一下springboot+HttpInvoke如何实现RPC调用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!开始用springboot2+hession4实现RPC服务时,发现第一个服务可以调用成功,但第二...
      99+
      2023-06-29
    • SpringBoot整合Dubbo框架,实现RPC服务远程调用
      目录一、Dubbo框架简介  1、框架依赖 二、与SpringBoot2.0整合  1、核心依赖2、项目结构说明3、核心配置 三、演示案例  1、服务远...
      99+
      2024-04-02
    • 基于Python实现主机远程控制
      目录1.概要设计2.详细设计2.调试分析3.测试结果前言: 本文为 HITwh 网络空间安全专业网络空间安全设计与实践 I 的选题之一,主要实现了远程监控局域网内的主机桌面与网络情况...
      99+
      2024-04-02
    • python怎么使用SimpleXMLRPCServer实现简单的rpc过程
      这篇文章主要介绍了python怎么使用SimpleXMLRPCServer实现简单的rpc过程的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python怎么使用SimpleXMLRPCServer实现简单的rp...
      99+
      2023-07-02
    • PHP XML-RPC 深入探讨:揭开远程过程调用的面纱
      XML-RPC 是一种基于 XML 的远程过程调用(RPC)协议,允许不同系统和语言之间通过网络进行通信。在 PHP 中,XML-RPC 库提供了方便的方式来实现 RPC 客户和服务器。 XML-RPC 概述 RPC 允许一个程序调用另一...
      99+
      2024-04-02
    • C#开发中如何处理远程调用和远程过程调用
      C#开发中如何处理远程调用和远程过程调用,需要具体代码示例引言:随着云计算和分布式系统的快速发展,远程调用和远程过程调用(Remote Procedure Call,简称RPC)在软件开发中变得越来越重要。C#作为一种强大的编程语言,在处理...
      99+
      2023-10-22
      远程过程调用 远程调用 C#开发
    • PyCharm利用pydevd-pycharm实现Python远程调试的详细过程
      目录一、介绍二、安装三、配置3.1 PyCharm端配置3.2 Ubuntu端配置四、实际调试一、介绍 Python远程调试,即在远程机器上运行python代码在本地进行调试,之前文...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作