结合rpyc使用python实现动态升级的方法
2015-02-12 21:37
996 查看
动态升级,就是程序不退出的情况下,将其代码更新的策略。假设集群含有多个机器,然后每个机器部署一套程序,当升级的时候就要去所有的上面部署一把。
(1)有个包装程序专门负责接口并检查是否需要更新,当需要更新的时候,下载下来。
(2)动态引用,将实质程序放到独立文件和文件夹下面,通过动态引用,调用的时候reload;
客户端代码:
服务器端:
在Test.py里面实现真正的逻辑
(1)有个包装程序专门负责接口并检查是否需要更新,当需要更新的时候,下载下来。
(2)动态引用,将实质程序放到独立文件和文件夹下面,通过动态引用,调用的时候reload;
客户端代码:
import rpyc import sys def update(remoteHost): c=rpyc.connect(remoteHost,12233) content="".join(file("Test.py","r").readlines()) print c.root.update(content) c.close() ipList=["10.101.92.211","10.101.90.203","10.101.91.239"] for ip in ipList: update(ip)
服务器端:
import time,subprocess from rpyc import Service from rpyc.utils.server import ThreadedServer import sys g_module=None class TimeService(Service): def exposed_sum(self,a,b): return a+b def exposed_show(self,cmd): #cmd='''grep "FAIL" /home/admin/alisatasknode/taskinfo/*/*/*/*/*/*/*.log ''' return self.do_cmd(cmd)[1] def do_cmd(self,cmd): p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() return p.returncode, out, err def exposed_process(self,starttime): self.modulePath="/home/admin/rpyc-3.3.0/server.py" global g_module if g_module is None: print("none") g_module=__import__('Test') else: print("reload") g_module=reload(g_module) Test=getattr(g_module,"Test") t=Test() return t.getFailure(starttime) def exposed_update(self,content): outfile=open("Test.py","w") outfile.write(content) return "OK" s=ThreadedServer(TimeService,port=12233,auto_register=False) s.start()
在Test.py里面实现真正的逻辑
import subprocess import os,time class Test(): def do_cmd(self,cmd): p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() return p.returncode, out, err def getFailure(self,starttime): key="Table not found" keyfile= key.replace(" ","_")+".txt" timeArray = time.strptime(starttime,"%Y:%m:%d:%H:%M:%S") timeStamp = int(time.mktime(timeArray)) print("timeStamp:%s" % (timeStamp)) cmd="grep '%s' /home/admin/alisatasknode/taskinfo/20141222/phoenix/20141221/*/*/*/*.log" % (key) print("cmd:%s" % (cmd)) r=self.do_cmd(cmd) print(r[0]) infos="" if r[0] == 0: filelist=r[1].split("\n") for info in filelist: filename=info.split(":")[0] #print("filename:%s" % (filename)) if filename.find("taskinfo") < 0: continue filestamp=os.path.getmtime(filename) if filestamp >= timeStamp: print("timeStamp:%s\tfilestamp:%s\ninfo:%s" % (timeStamp,filestamp,info)) if info.find(key): infos=infos+"\n"+info return infos ~
相关文章推荐
- Python使用logging结合decorator模式实现优化日志输出的方法
- Python使用logging结合decorator模式实现优化日志输出的方法
- 使用RenderControl方法实现动态加载用户控件
- 安卓四大组件之二#2-使用AIDL技术实现动态调用其他app中的Service的方法
- 使用动态JavaScript实现多级菜单联动时不刷新页面的方法
- python中getattr函数使用方法 getattr实现工厂模式
- 升级Python而导致的YUM服务无法使用的修复方法
- 使用RenderControl方法实现动态加载用户控件
- 跨平台python异步回调机制实现和使用方法
- Python实现动态添加类的属性或成员函数的解决方法
- 使用dwr实现下拉框级联和js实现动态选择option的selected状态方法总结
- 使用SharedStore的Python实现方法
- 跨平台python异步回调机制实现和使用方法
- 使用反射实现根据名称动态创建窗体的几种方法。
- fedora 15 升级python后yum无法使用的解决方法
- C# 使用反射实现根据名称动态创建窗体的几种方法
- VS2005中TableAdapter中实现动态查询并使用LIKE的方法整理
- python利用字典保存配置实现动态调用模块类方法
- python中动态加载模块和类方法实现
- python中getattr函数使用方法 getattr实现工厂模式