Python的XMLRPC机制:实现跨进程间、client/server端通信
SimpleXMLRPCServer模块式python语言的一个基于 xml 格式的进程间通信的基础框架。
SimpleXMLRPCServer是一个单线程的服务器,这意味着,如果几个客户端同时发出多个请求,其它的请求就必须等待第一个请求完成以后才 能继续。此处也有一个解决方法。
例子代码如下:
创建一个server端主进程,并且利用一个线程开启一个server线程,并开启一个client进程作为child 进程。
MyRemoteService包含三个serveice服务方法,我们测试Add方法,从server端返回计算结果。
#-*- coding: UTF-8 -*- import wx
import threading
import sys
from SimpleXMLRPCServer import SimpleXMLRPCServer class XMLRPCServerThread(threading.Thread):
def __init__(self, remoteServiceInstance, host='127.0.0.1', port=1234):
self._RemoteServiceInstance = remoteServiceInstance
self._Host = host
self._Port = port
threading.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 = obj def Add(self, a, b):
return a + b def 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 True def __GetRPCThread(self, host='localhost', port=1234):
remoteObj = MyRemoteService(self)
rpcThread = XMLRPCServerThread(remoteObj, host, port)
rpcThread.start()
return rpcThread def 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 SimpleXMLRPCServer class 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, '')
self._AddText = wx.StaticText(mainPanel, -1, ' + ')
self._BText = wx.TextCtrl(mainPanel, -1, '')
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()
运行结果如下:
Python的XMLRPC机制:实现跨进程间、client/server端通信的更多相关文章
- 0-Android使用Ashmem机制进行跨进程共享内存
Android使用Ashmem机制进行跨进程共享内存 来源: http://blog.csdn.net/luoshengyang/article/details/6651971 导语: 在Androi ...
- Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令.
Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令. 一丶socket套接字 什么是socket套接字: 专业理解: socket是应用层与TCP/IP ...
- python 学习笔记 - Queue & Pipes,进程间通讯
上面写了Python如何创建多个进程,但是前面文章中创建的进程都是哑巴和聋子,自己顾自己执行,不会相互交流.那么如何让进程间相互说说话呢?Python为我们提供了一个函数multiprocessing ...
- python 全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)
昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...
- python全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)
昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...
- Python程序中的进程操作-进程间数据共享(multiprocess.Manager)
目录 一.进程之间的数据共享 1.1 Manager模块介绍 1.2 Manager例子 一.进程之间的数据共享 展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大 ...
- Python进阶----进程间数据隔离, join阻塞等待, 进程属性, 僵尸进程和孤儿进程, 守护进程
Python进阶----进程间数据隔离, join阻塞等待, 进程属性, 僵尸进程和孤儿进程, 守护进程 一丶获取进程以及父进程的pid 含义: 进程在内存中开启多个,操作系统如何区分这些进程, ...
- python并发编程之多进程1-----------互斥锁与进程间的通信
一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...
- python并发编程之多进程1--(互斥锁与进程间的通信)
一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...
随机推荐
- 带你一分钟理解 JavaScript 闭包
什么是闭包? 先看一段代码: function a(){ var n = 0; function inc() { n++; console.log(n); } inc(); inc(); } a(); ...
- foxmail客户端总是提示接收密码错误
如上图所示. 我知道的一个原因是 发送太多邮件所致,导致发件服务器触发规则限制登录. 如果之前发的不是很多的话,可以在设置的帐号选项里删除这个账户,再重新建一个.
- Struts2.xml中result type属性说明
在struts2配置XML里,result中type属性有以下几种: 1.dispatcher:服务器跳转到前台,后面跟着可以是JSP.htm等等前台页面,默认是这种. 2.redirect:客户端跳 ...
- Android CountDownTimer 倒计时
摘自:http://www.cnblogs.com/over140/archive/2011/12/20/2294220.html 继承关系 public abstract class CountDo ...
- opengl 函数
( 7 )光栅化.象素操作函数. 像素位置 glRasterPos*() .线型宽度 glLineWidth() .多边形绘制模式 glPolygonMode() ,读取象素 glReadPixel( ...
- MyISAM与InnoDB的区别
1. 存储结构: MyISAM:(文件名以表名开始) .frm文件存储表定义 .MYD文件存储数据 .MYI文件存储索引 InnoDB: 所有的表保存在同一个(也可能多个)数据文件中,表的大小仅受限于 ...
- Java基础知识强化之IO流笔记17:FileOutputStream构造方法使用
1. 可以参照之前写的笔记: Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流) 2. FileOutputStream(常用的)构造方法: FileOu ...
- Android Studio学习随笔-移动动画的实现
在上一篇博客我已经讲述了三种事件的实现方法,而现在我用复用方法来实现控件的自动移动,当然要实现控件的移动,先得在activity_main.xml文件中放置一个控件,此处我放置的是一个button控件 ...
- 安装Stomp扩展时错误提示error: 'zend_class_entry' has no member named 'default_properties'
在安装stomp扩展时, 有这样的提示 error: 'zend_class_entry' has no member named 'default_properties' 交待下安装上下文, sto ...
- linux(centos)上配置nginx、mysql、php-fpm、redis开机启动<转>
原文 http://levi.cg.am/archives/2925 I.nginx开机启动 在/etc/init.d/目录下创建脚本 1 vi /etc/init.d/nginx 更改脚本权限 1 ...