结合rpyc使用python实现动态升级的方法
动态升级,就是程序不退出的情况下,将其代码更新的策略。假设集群含有多个机器,然后每个机器部署一套程序,当升级的时候就要去所有的上面部署一把。
(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
~
结合rpyc使用python实现动态升级的方法的更多相关文章
- python函数动态参数详解
Python的动态参数: 1,参数前一个"*":在函数中会把传的参数转成一个元组. def func (*args): print(args) func(123,1,2,'a') ...
- Android 插件化 动态升级
最新内容请见原文:Android 插件化 动态升级 不少朋友私信以及 Android开源交流几个 QQ 群 中都问到这个问题,这里简单介绍下 1.作用 大多数朋友开始接触这个问题是因为 App 爆棚了 ...
- Centos 6.4 python 2.6 升级到 2.7
Centos 6.4 python 2.6 升级到 2.7 分类: Python Linux2013-09-13 21:35 37278人阅读 评论(2) 收藏 举报 一开始有这个需求,是因为用 Ya ...
- CentOS6.5 python 2.6升级到2.7
在CentOS6.5下,将自带的python2.6.6升级到python2.7.3,解决方法如下: 下载python2.7.3包,并解压缩,输入命令:#wget http://python.org/f ...
- python importlib动态导入模块
一般而言,当我们需要某些功能的模块时(无论是内置模块或自定义功能的模块),可以通过import module 或者 from * import module的方式导入,这属于静态导入,很容易理解. 而 ...
- python高级-动态特性(20)
一.动态语⾔的定义 动态语言是在运行时确定数据类型的语言.变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型.现在比较热门的动态语言有:Python.PHP.JavaScript.Obj ...
- Python importlib(动态导入模块)
使用 Python importlib(动态导入模块) 可以将字符串型的模块名导入 示例: import importlib module = 'module name' # 字符串型模块名 test ...
- CentOS 7.0 下 Python 2.7 升级到 Python 3.5
前段因为时间工作需要,要把 Centos 7.0 默认安装的 Python 2.7 升级到 Python 3.5. 具体操作如下: # 安装 gcc gcc-c++ 等编译工具软件 yum insta ...
- 【大话QT之十二】基于CTK Plugin Framework的插件版本号动态升级
应用需求: 某些场景下我们可能面临这种问题,在执行着的应用程序不能终止的情况下,升级某个功能(或添,或减.或改动).在不採用CTK Plugin Framework插件系统架构的情况下这将是非常困难的 ...
随机推荐
- PHP开发APP接口(一)
php以json或者xml 形式返回给app.明白这点就很好说了,就是把数据包装成json或者xml,返回给APP 定义抽象APP基类: <?php /** * 定义API抽象类 */ abst ...
- Java-工厂设计模式
引言: 工厂设计模式分为三种: 简单工厂 工厂方法 抽象工厂 联想四种情况 (1).还没有工厂时代:假如还没有工业革命,如果一个客户要一件产品,一般的做法是客户去创建一件产品,然后拿来用. (2).简 ...
- DataGridView减少闪烁的解决办法
Reducing flicker, blinking in DataGridView http://www.codeproject.com/Tips/390496/Reducing-flicker-b ...
- mysql的limit、order by和group by的用法
程序执行会重复 用mysql很长时间,limit是分页的一个好工具, select * from table_a where num = 4 limit 1,10, select * from tab ...
- [学习笔记]设计模式之Bridge
写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 “魔镜啊魔镜,谁是这个世界上最美丽的人?”月光中,一个低沉的声音回荡在女王的卧室.“是美丽的白雪公主,她正和小霍比特人们幸福快乐地生活 ...
- C++中各种数据量类型转换
要在Unicode字符集环境下把CString转化为char* 方法: CString str = _T("D://校内项目//QQ.bmp");//////leo这个NB 可以 ...
- Linux下搭建Oracle11g RAC(7)----安装Oracle 软件
从此步骤开始,我们正式安装oracle软件: ① 以oracle用户登录图形界面,执行/home/oracle/database/runInstaller,进入OUI的图形安装界面: ② 进入OUI安 ...
- python 面向对象深入理解
面向过程 函数式编程 面向对象编程:面向对象是由类和对象组成,只要用类和对象实现的,就是面向对象编程 def Bar(): print "This is Bar " ...
- 一个玩具程序——测试密码强度(pure C)
替人写的C语言作业… 介绍: 程序名称:密码强度检测程序 注释风格:doxygen 测试环境:linux3.6, gcc4.7window7, vs2012 已知问题:1. 算法与参考链接不一致,结果 ...
- sql中对查询出来的数据进行分页
当sql中存储的数据量比较大时,在web中 数据显示时都会对数据进行分页,分页不会在客户端进行分页,而是在数据库查询过程中进行了分页. sql代码: DECLARE @pageindex INT; - ...