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

(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实现动态升级的方法的更多相关文章

  1. python函数动态参数详解

    Python的动态参数: 1,参数前一个"*":在函数中会把传的参数转成一个元组. def func (*args): print(args) func(123,1,2,'a') ...

  2. Android 插件化 动态升级

    最新内容请见原文:Android 插件化 动态升级 不少朋友私信以及 Android开源交流几个 QQ 群 中都问到这个问题,这里简单介绍下 1.作用 大多数朋友开始接触这个问题是因为 App 爆棚了 ...

  3. 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 ...

  4. CentOS6.5 python 2.6升级到2.7

    在CentOS6.5下,将自带的python2.6.6升级到python2.7.3,解决方法如下: 下载python2.7.3包,并解压缩,输入命令:#wget http://python.org/f ...

  5. python importlib动态导入模块

    一般而言,当我们需要某些功能的模块时(无论是内置模块或自定义功能的模块),可以通过import module 或者 from * import module的方式导入,这属于静态导入,很容易理解. 而 ...

  6. python高级-动态特性(20)

    一.动态语⾔的定义 动态语言是在运行时确定数据类型的语言.变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型.现在比较热门的动态语言有:Python.PHP.JavaScript.Obj ...

  7. Python importlib(动态导入模块)

    使用 Python importlib(动态导入模块) 可以将字符串型的模块名导入 示例: import importlib module = 'module name' # 字符串型模块名 test ...

  8. CentOS 7.0 下 Python 2.7 升级到 Python 3.5

    前段因为时间工作需要,要把 Centos 7.0 默认安装的 Python 2.7 升级到 Python 3.5. 具体操作如下: # 安装 gcc gcc-c++ 等编译工具软件 yum insta ...

  9. 【大话QT之十二】基于CTK Plugin Framework的插件版本号动态升级

    应用需求: 某些场景下我们可能面临这种问题,在执行着的应用程序不能终止的情况下,升级某个功能(或添,或减.或改动).在不採用CTK Plugin Framework插件系统架构的情况下这将是非常困难的 ...

随机推荐

  1. jquery 1.9里面已经删除了toggle(fn1, fn2)函数

    转自:http://blog.sina.com.cn/s/blog_50042fab0101c7a9.html jquery 1.9里面已经删除了toggle(fn1, fn2)函数: 引用 Note ...

  2. The server quit without updating PID file (mysql.pid)一次意外mysql停止运行备忘录

    [root@iZ23tsvd9h4Z ~]# service mysqld status ERROR! MySQL (Percona Server) is not running, but lock ...

  3. Ajax提交打开新窗口,浏览器拦截处理

    //主要是添加同步处理 $.ajax({ url: "ashx/OrderHander.ashx?action=CheckRepeat", data: { "OrderI ...

  4. sublimeText3安装package control和禁止弹出更新下载弹窗

    1.sublimeText3安装package control import urllib.request,os; pf = 'Package Control.sublime-package'; ip ...

  5. request对象方法详解

    自己整理的 javax.servlet.http.HttpServletrequest 所有方法,欢迎收藏! 方法名 说明 isUserInRole 判断认证后的用户是否属于某一成员组 getAttr ...

  6. Show Global Status 整理

    原文来源:MySQL 5.5 Reference Manual 部分翻译取自:<MySQL_5.1中文参考手册> 转载请注明原文链接http://www.cnblogs.com/lenag ...

  7. 基于AFNetworking3.0网络封装

    概述 对于开发人员来说,学习网络层知识是必备的,任何一款App的开发,都需要到网络请求接口.很多朋友都还在使用原生的NSURLConnection一行一行地写,代码到处是,这样维护起来更困难了. 对于 ...

  8. DevExpress的GridView设置特定行的样式

    GridView控件绑定事件: gridView_SampleData.CustomDrawCell += gridView_SampleData_CustomDrawCell; 根据自定义逻辑来改变 ...

  9. Android(java)学习笔记181:利用Service在后台播放背景音乐

    1.在android应用程序里,有一种没有UI的类(android.app.Service)——Service.简单来说,Service是一个 background process(背景程序),通过背 ...

  10. zTree在Asp.Net中的使用

    前台代码: <link rel="stylesheet" href="../css/zTreeStyle/zTreeStyle.css" type=&qu ...