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--(互斥锁与进程间的通信)
一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...
随机推荐
- Git全解析之用起来先
文章目录 1. Git全解析之用起来先 1.1. 先安装Git环境 1.2. 配置 1.3. 简单了解Git 1.3.1. Git对象模型 SHA 1.3.2. Git目录与工作目录 1.4. 可以开 ...
- 怎么调试EXC_BAD_ACCESS错误
当你遇到了一个EXC_BAD_ACCESS错误,我通常会给开发者几个建议: 1.在可执行选项中设置NSZombieEnabled参数,这有时会帮缩小问题的范围: 2.运行apple的内存检测工具,如 ...
- memkeys 安装时遇到的问题及解决办法
某天由于某需要,安装tumblr的开源工具memkeys .但还是一如既往地不是一帆风顺. 在./configure 时出现如下错误信息: configure.in:14: error: possib ...
- 用C#来开发CAD插件,含源代码
转自原文 用C#来开发CAD插件,含源代码 CAD插件看起来很神秘,其实一个合格码农经过几天就能快速掌握.没什么秘密,开发CAD插件和winform一样简单学几个类库用法就是(只是太多人不喜欢知识分享 ...
- 【bzoj2594】[Wc2006]水管局长数据加强版
真是神题 当时调了几天没调出来 后来没管了 当时把fread去掉就TLE,加上就RE 一直在底下跟网上的程序拍,尝试各种优化常数都没用 拍出几组不一样的,发现我是对的,醉了,网上那个是怎么过的 记一下 ...
- 嵌入式C语言优化小技巧
嵌入式C语言优化小技巧 1 概述 嵌入式系统是指完成一种或几种特定功能的计算机系统,具有自动化程度高,响应速度快等优点,目前已广泛应用于消费电子,工业控制等领域.嵌入式系统受其使用的硬件以及运行环境的 ...
- 关于Form窗体的StartPosition 属性如何设置的问题
1.让窗体在启动时在指定位置出现 form1.StartPosition Manual CenterScreen WindowsDefaultLocation (default) WindowsDef ...
- 多队列网卡简介以及Linux通过网卡发送数据包源码解读
http://blog.csdn.net/yanghua_kobe/article/details/7485254 首先我们看一下一个主流多队列网卡(E1000)跟多核CPU之间的关系图: 非多队列: ...
- Qt 学习之路 :进程间通信
上一章我们了解了有关进程的基本知识.我们将进程理解为相互独立的正在运行的程序.由于二者是相互独立的,就存在交互的可能性,也就是我们所说的进程间通信(Inter-Process Communicatio ...
- NSString截取文件名(很笨的方法)
对NSString的操作不熟悉,目前采用以下方法取得路径中的文件名以及文件夹路径 NSString* test=[[NSString alloc]initWithFormat:@"D:\\c ...