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端通信的更多相关文章

  1. 0-Android使用Ashmem机制进行跨进程共享内存

    Android使用Ashmem机制进行跨进程共享内存 来源: http://blog.csdn.net/luoshengyang/article/details/6651971 导语: 在Androi ...

  2. Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令.

    Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令. 一丶socket套接字 什么是socket套接字: ​ ​  ​ 专业理解: socket是应用层与TCP/IP ...

  3. python 学习笔记 - Queue & Pipes,进程间通讯

    上面写了Python如何创建多个进程,但是前面文章中创建的进程都是哑巴和聋子,自己顾自己执行,不会相互交流.那么如何让进程间相互说说话呢?Python为我们提供了一个函数multiprocessing ...

  4. python 全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)

    昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...

  5. python全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)

    昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...

  6. Python程序中的进程操作-进程间数据共享(multiprocess.Manager)

    目录 一.进程之间的数据共享 1.1 Manager模块介绍 1.2 Manager例子 一.进程之间的数据共享 展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大 ...

  7. Python进阶----进程间数据隔离, join阻塞等待, 进程属性, 僵尸进程和孤儿进程, 守护进程

    Python进阶----进程间数据隔离, join阻塞等待, 进程属性, 僵尸进程和孤儿进程, 守护进程 一丶获取进程以及父进程的pid 含义:    进程在内存中开启多个,操作系统如何区分这些进程, ...

  8. python并发编程之多进程1-----------互斥锁与进程间的通信

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

  9. python并发编程之多进程1--(互斥锁与进程间的通信)

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

随机推荐

  1. Linux下报 java.net.SocketException权限不够 异常解决

    转载自:http://wangchongan.com/articles/java-net-socket-exception-permission-denied.html 今天在Linux下用Jetty ...

  2. 看小白如何解决ajax跨域问题

    由于此前很少写前端的代码(哈哈,不合格的程序员啊),最近项目中用到json作为系统间交互的手段,自然就伴随着众多ajax请求,随之而来的就是要解决ajax的跨域问题.本篇将讲述一个小白从遇到跨域不知道 ...

  3. dubbo(soa分布式)与cobar(mysql分布式)

    http://www.jianshu.com/p/0dde591f21d0 (Dubbo编译不是个顺利的事) Cobar是提供关系型数据库(MySQL)分布式服务的中间件,它可以让传统的数据库得到良好 ...

  4. dom4j处理java中xml还是很方便的

    http://blog.csdn.net/chenghui0317/article/details/11486271 输入: String flighter = RequestUtil.get(&qu ...

  5. 深入理解Android 自定义attr Style styleable以及其应用

    相信每一位从事Android开发的猿都遇到过需要自己去自定义View的需求,如果想通过xml指定一些我们自己需要的参数,就需要自己声明一个styleable,并在里面自己定义一些attr属性,这个过程 ...

  6. iOS多线程编程之GCD的使用

    什么是线程呢? 1个CPU执行的CPU命令列为一条无分叉的路径即为线程. 这种无分叉路径不止1条,存在多条时即为多线程. 什么是GCD? Grand Central Dispatch (GCD)是异步 ...

  7. linux 调试

    strace gdb tcpdump valgrind perf

  8. BeautifulSoup在Windows下安装(running 2to3)

    在windows下安装beautifulsoup经常会出现说是在python3下无法运行Python2的代码,这时需要将Python下的tool下的scripts目录添加到环境变量中,然后运行2to3 ...

  9. Builder 建造者模式

    简介 建造者模式的概念:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以有不同的表示. 大概的意思,就是一套的构建过程可以有不同的产品(表示)出来.这些产品(表示)都按照这一套的构建过程被 ...

  10. Linq101-Generation

    using System; using System.Linq; namespace Linq101 { class Generation { /// <summary> /// This ...