热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python的XMLRPC机制:实现跨进程间、client/server端通信

SimpleXMLRPCServer模块式python语言的一个基于xml格式的进程间通信的基础框架。SimpleXMLRPCServer是一个单线程的服务器,这意味

SimpleXMLRPCServer模块式python语言的一个基于 xml 格式的进程间通信的基础框架。

SimpleXMLRPCServer是一个单线程的服务器,这意味着,如果几个客户端同时发出多个请求,其它的请求就必须等待第一个请求完成以后才 能继续。此处也有一个解决方法。

例子代码如下:

创建一个server端主进程,并且利用一个线程开启一个server线程,并开启一个client进程作为child 进程。

MyRemoteService包含三个serveice服务方法,我们测试Add方法,从server端返回计算结果。

#-*- coding: UTF-8 -*-import wx
import threading
import sys
from SimpleXMLRPCServer import SimpleXMLRPCServerclass XMLRPCServerThread(threading.Thread):def __init__(self, remoteServiceInstance, host='127.0.0.1', port=1234):self._RemoteServiceInstance = remoteServiceInstanceself._Host = hostself._Port = portthreading.Thread.__init__(self)def stop(self):self._Server.shutdown() def run(self):self._Server = SimpleXMLRPCServer( (self._Host, self._Port), logRequests=False, allow_none = True )self._Server.register_instance( self._RemoteServiceInstance )self._Server.serve_forever()class MyRemoteService(object):def __init__(self, obj):self.obj = objdef Add(self, a, b):return a + bdef NoReturn(self):print 'xxxx'def Empty(self):return u'中国 .'class MyFrame(wx.Frame):def __init__(self, parent):wx.Frame.__init__(self, parent, -1, "Server service")mainPanel = wx.Panel(self, size = (300, 400))mainPanel.SetBackgroundColour(wx.Colour(0,122,200))sizer = wx.BoxSizer(wx.VERTICAL)sizer.Add(mainPanel, 1, wx.EXPAND)self.SetSizerAndFit(sizer)## @detail ShellApp主应用程序的核
class ShellApp(wx.App):def OnInit(self):mainFrame = MyFrame(None)self.Bind(wx.EVT_END_PROCESS, self.OnProcessEnded)self.__ServerThread = self.__GetRPCThread()self.__ChildProcess = wx.Process(self)pid = wx.Execute('python remoteClient.py', wx.EXEC_NOHIDE|wx.EXEC_ASYNC, self.__ChildProcess) mainFrame.Show(True) return Truedef __GetRPCThread(self, host='localhost', port=1234):remoteObj = MyRemoteService(self)rpcThread = XMLRPCServerThread(remoteObj, host, port)rpcThread.start()return rpcThreaddef OnProcessEnded(self, evt):print 'Child process exist'self.__ChildProcess.Destroy()self.__ServerThread.stop()self.Exit()# @detail main程序的主入口程序
if __name__ == '__main__': app = ShellApp()#重新定向wxpython的输出输入和错误输出到系统标准输入输出sys.stdin = sys.__stdin__sys.stdout = sys.__stdout__sys.stderr = sys.__stderr__app.MainLoop()

client端代码如下:

#-*- coding: UTF-8 -*-
import wx
import sys
import xmlrpclib #客户端from SimpleXMLRPCServer import SimpleXMLRPCServerclass MyFrame(wx.Frame):def __init__(self, parent):wx.Frame.__init__(self, parent, -1, "Client app")mainPanel = wx.Panel(self, size = (300, 200))addButton = wx.Button(mainPanel, -1, 'Add')addButton.Bind(wx.EVT_BUTTON, self.__OnAddClicked)self._AText = wx.TextCtrl(mainPanel, -1, '10')self._AddText = wx.StaticText(mainPanel, -1, ' + ')self._BText = wx.TextCtrl(mainPanel, -1, '23')self._Label = wx.StaticText(self, -1, ' = ')self._SumText = wx.TextCtrl(mainPanel)panelSizer = wx.BoxSizer(wx.HORIZONTAL)panelSizer.Add(addButton, 0, wx.ALL, 6) panelSizer.Add(self._AText, 0, wx.ALL, 6)panelSizer.Add(self._AddText, 0, wx.ALL, 6)panelSizer.Add(self._BText, 0, wx.ALL, 6)panelSizer.Add(self._Label, 0, wx.ALL, 6)panelSizer.Add(self._SumText, 0, wx.ALL, 6)mainPanel.SetSizer(panelSizer)mainPanel.SetBackgroundColour(wx.Colour(122,12,20))sizer = wx.BoxSizer(wx.VERTICAL)sizer.Add(mainPanel, 1, wx.EXPAND)self.SetSizerAndFit(sizer)self._Proxy = xmlrpclib.ServerProxy('http://127.0.0.1:1234') def __OnAddClicked(self, evt):a = int(self._AText.GetLabel())b = int(self._BText.GetLabel())sum = self._Proxy.Add(a, b)self._SumText.SetLabel('%s'%sum)self._Proxy.NoReturn()## @detail ShellApp主应用程序的核
class ShellApp(wx.App): def OnInit(self):mainFrame = MyFrame(None)mainFrame.Show(True) return True# @detail main程序的主入口程序
if __name__ == '__main__': app = ShellApp()#重新定向wxpython的输出输入和错误输出到系统标准输入输出sys.stdin = sys.__stdin__sys.stdout = sys.__stdout__sys.stderr = sys.__stderr__app.MainLoop()

运行结果如下:

 

 

转:https://www.cnblogs.com/ankier/p/3231288.html



推荐阅读
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
author-avatar
mobiledu2502925953
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有