热门标签 | 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



推荐阅读
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 本文介绍了ArcXML配置文件的分类及其在不同服务中的应用,详细解释了地图配置文件的结构和功能,包括其在Image Service、Feature Service以及ArcMap Server中的使用方法。 ... [详细]
  • 本主题面向IT专业人士,介绍了Windows Server 2012 R2和Windows Server 2012中的组托管服务账户(gMSA),涵盖了其应用场景、功能改进、硬件和软件要求以及相关资源。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 本文详细介绍了如何通过RPM包在Linux系统(如CentOS)上安装MySQL 5.6。涵盖了检查现有安装、下载和安装RPM包、配置MySQL以及设置远程访问和开机自启动等步骤。 ... [详细]
  • ZooKeeper集群脑裂问题及其解决方案
    本文深入探讨了ZooKeeper集群中可能出现的脑裂问题,分析其成因,并提供了多种有效的解决方案,确保集群在高可用性环境下的稳定运行。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
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社区 版权所有