您的位置:首页 > 编程语言 > Python开发

结合rpyc使用python实现动态升级的方法

2015-02-12 21:37 996 查看
动态升级,就是程序不退出的情况下,将其代码更新的策略。假设集群含有多个机器,然后每个机器部署一套程序,当升级的时候就要去所有的上面部署一把。

(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
~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: