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上下载代码并导入eclipse
主要分为两步: 1.先从git下载代码到本地git仓库 2.eclipse import导入存在的maven项目
- windows 批量执行命令的脚本
因为老板一个电话,我的国庆节就没了....,老板要我写个东西,能批量执行500台windows的命令并返回结果,虽然完成以后是非常的简单,但是因为我走了很多弯路,一开始想用powershell来写,后 ...
- Lucene为不同字段指定不同分词器(转)
在lucene使用过程中,如果要对同一IndexWriter中不同 Document,不同Field中使用不同的analyzer,我们该如何实现呢? 通过对<lucene in action&g ...
- [Angular 2] NgNonBindable
If you want to print someting like {{content}} on the html, using ng-non-bindable directive: <div ...
- Quartz简单使用
官方的Quartz会提供例子的,例子看个前三四个感觉就够用了,主要就是起Timer的作用,但是比timer稳定,而且功能更全. UpdateClientTimer.task(ClearJob.clas ...
- MyISAM与InnoDB的区别
1. 存储结构: MyISAM:(文件名以表名开始) .frm文件存储表定义 .MYD文件存储数据 .MYI文件存储索引 InnoDB: 所有的表保存在同一个(也可能多个)数据文件中,表的大小仅受限于 ...
- fluentd结合kibana、elasticsearch实时搜索分析hadoop集群日志<转>
转自 http://blog.csdn.net/jiedushi/article/details/12003171 Fluentd是一个开源收集事件和日志系统,它目前提供150+扩展插件让你存储大数据 ...
- Android 发送验证码 简易代码
效果 Activity ;//倒计时 private Timer timer; private Handler handler = new Handler() { public void handle ...
- JS 改变input 输入框样式
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- .NET读取Excel
1.代码 string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Path + ";Ext ...