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



推荐阅读
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
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社区 版权所有