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

(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. .NET中ToString()的用法

    一.数字转换到字符串 格式说明符     说明       示例                         输出 C                 货币      2.5.ToString(& ...

  2. Quartz定时任务学习(五)触发器

    顾名思义,Trigger(触发器)的责任就是触发一个 Job 去执行.当用 Scheduler 注册一个 Job 的时候要创建一个 Trigger 与这个 Job 相关联.Quartz 提供了四种类型 ...

  3. jquerymobile知识点:动态ListView

    这里要讲的是jqueryMobile 中的ListView 动态的列表 <ul data-role="listview" data-inset="true" ...

  4. android 64 sd卡读写的操作

    package com.itheima.writesd; import java.io.File; import java.io.FileNotFoundException; import java. ...

  5. linux-0.11内核 调试教程+GCC源代码

    http://pan.baidu.com/share/home?uk=453348606&view=share#category/type=0 http://blog.csdn.net/old ...

  6. ViewPager中使用自定义的ListView实例

    这篇内容是上一篇的延续,因为在上一篇的测试ViewPager成功了,才能实现这一篇的和ListView合在一起使用 效果图如下: 不愿意说理论,直接上代码 1.清单文件 activity_main.x ...

  7. JSPatch 成长之路

    在这次 GMTC 大会上,我见到了 JSPatch 的作者 bang.在这之前我就和他在网上认识并聊过很多次,bang 也在这个公众号上投稿发表了多篇关于 JSPatch 的文章,包括:JSPatch ...

  8. Obj2002java

    计算球体积 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  9. hdu2039java

    三角形 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  10. 能发送http请求(get,post)的工具

    能发送http请求(get,post)的工具, 1.  fiddler 前端自己模拟发送请求 2.  其他 链接:https://www.zhihu.com/question/20367546/ans ...