python通过重启线程,实现服务的热加载
这个思路后来证明不能用于工作。
因为线程调用没有及时返回,所以不能用这种方式来重启服务。
但作为脑洞,也应该作个记录。
import os
import shutil
import datetime
import threading
import time
import inspect
import ctypes
import hashlib
PATH_DIR = "./"
# 求字符串的md5码
def md5_str(org_str):
md5obj = hashlib.md5()
md5obj.update(str(org_str).encode("utf8"))
_hash = md5obj.hexdigest()
return str(_hash).upper()
# 求一个文件的md5码
def get_file_md5(file_path):
"""
获取文件md5值
:param file_path: 文件路径名
:return: 文件md5值
"""
with open(file_path, 'rb') as f:
return md5_str(f.read())
# 求一个文件夹下所有文件MD5码总和的MD5码
def get_path_files(files_path):
md5_total = ""
for parent, dirnames, filenames in os.walk(files_path, followlinks=True):
for filename in filenames:
file_path = os.path.join(parent, filename)
md5_total += get_file_md5(file_path)
return md5_str(md5_total)
def _async_raise(tid, exctype):
"""raises the exception, performs cleanup if needed"""
tid = ctypes.c_long(tid)
if not inspect.isclass(exctype):
exctype = type(exctype)
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
if res == 0:
raise ValueError("invalid thread id")
elif res != 1:
# """if it returns a number greater than one, you're in trouble,
# and you should call it again with exc=NULL to revert the effect"""
ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
raise SystemError("PyThreadState_SetAsyncExc failed")
# 配合上个_async_raise函数,优雅关闭线程
def stop_thread(thread):
_async_raise(thread.ident, SystemExit)
# 示例线程
class TestThread(threading.Thread):
def run(self):
print("begin")
time.sleep(0.1)
print('end')
# 先启动线程,并进行文件夹内所有文件的MD5码求值
t = TestThread()
t.start()
t.join()
files_md5 = get_path_files(PATH_DIR)
while True:
# 每隔sleep时间,作一次文件夹MD5码求值,如果发生了变化,说明文件更新,则关闭线程,然后重启线程,实现服务的热加载。
new_files_md5 = get_path_files(PATH_DIR)
print(new_files_md5)
if new_files_md5 == files_md5:
pass
else:
files_md5 = new_files_md5
print("stop thread")
try:
stop_thread(t)
except ValueError as e:
print(e)
except SystemError as e:
print(e)
finally:
print("start thread")
t = TestThread()
t.start()
t.join()
time.sleep(5)
===============输出分隔线=============
AD45C4B0E8112D1E238A5E12DBD9735A
AD45C4B0E8112D1E238A5E12DBD9735A
AD45C4B0E8112D1E238A5E12DBD9735A
AD45C4B0E8112D1E238A5E12DBD9735A
AD45C4B0E8112D1E238A5E12DBD9735A
AD45C4B0E8112D1E238A5E12DBD9735A
AD45C4B0E8112D1E238A5E12DBD9735A
AD45C4B0E8112D1E238A5E12DBD9735A
5B63C272EB1642ADA89CA4602584C28C
stop thread
invalid thread id
start thread
begin
end
5B63C272EB1642ADA89CA4602584C28C
5B63C272EB1642ADA89CA4602584C28C
5B63C272EB1642ADA89CA4602584C28C
5B63C272EB1642ADA89CA4602584C28C
D4BB8E11D4936ABF35ABFF638673E753
stop thread
invalid thread id
start thread
begin
end
D4BB8E11D4936ABF35ABFF638673E753
D4BB8E11D4936ABF35ABFF638673E753
27071D9DC57B9D190CBFBAE05FDD76E2
stop thread
invalid thread id
start thread
begin
end
27071D9DC57B9D190CBFBAE05FDD76E2
27071D9DC57B9D190CBFBAE05FDD76E2
27071D9DC57B9D190CBFBAE05FDD76E2
27071D9DC57B9D190CBFBAE05FDD76E2
27071D9DC57B9D190CBFBAE05FDD76E2
python通过重启线程,实现服务的热加载的更多相关文章
- 寻找丢失的微服务-HAProxy热加载问题的发现与分析 原创: 单既喜 一点大数据技术团队 4月8日 在一点资讯的容器计算平台中,我们通过HAProxy进行Marathon服务发现。本文记录HAProxy服务热加载后某微服务50%概率失效的问题。设计3组对比实验,验证了陈旧配置的HAProxy在Reload时没有退出进而导致微服务丢失,并给出了解决方案. Keywords:HAProxy热加
寻找丢失的微服务-HAProxy热加载问题的发现与分析 原创: 单既喜 一点大数据技术团队 4月8日 在一点资讯的容器计算平台中,我们通过HAProxy进行Marathon服务发现.本文记录HAPro ...
- SpringBoot自带热加载开发工具
SpringBoot自带热加载开发工具 maven配置: <!-- SpringBoot自带热加载开发工具 --> <dependency> <groupId>or ...
- 如何用Python实现配置热加载?
背景 由于最近工作需求,需要在已有项目添加一个新功能,实现配置热加载的功能.所谓的配置热加载,也就是说当服务收到配置更新消息之后,我们不用重启服务就可以使用最新的配置去执行任务. 如何实现 下面我分别 ...
- eclipse tomcat 热加载 免除重启
Tomcat的热部署(以后就不用重起了) 1. tomcat上的部署问题,有时候也是个麻烦的问题,要是不采用热部署,我们就只能每次对原来的文件做一次改动的时候就要重新部署, 而每次重新部署都 ...
- Eclipse+Tomcat实现热部署/热加载配置,修改java代码无需重启tomcat
一.Tomcat热加载配置 Eclipse Package Explorer中找到Servers,点击你所需要运行的tomcat的config配置文件,例如 demo-config,双击该文件夹下的s ...
- java的热部署和热加载
ps:热部署和热加载其实是两个类似但不同的概念,之前理解不深,so,这篇文章重构了下. 一.热部署与热加载 在应用运行的时升级软件,无需重新启动的方式有两种,热部署和热加载. 对于Java应用程序来说 ...
- 配置文件热加载的go语言实现
通常我们更新应用程序的配置文件,都需要手动重启程序或手动重新加载配置.假设一组服务部署在10台机器上,你需要借助批量运维工具执行重启命令,而且10台同时重启可能还会造成服务短暂不可用.要是更新配置后, ...
- dubbo的jmeter压测时jar包的热加载/动态加载
在做dubbo的jmeter压测时,需要把jar包放入jmeter的lib/ext目录下,但是jmeter启动的时候会自动加载这个目录lib目录及lib/ext目录,这样启动后放入这些目录下的jar包 ...
- 原来热加载如此简单,手动写一个 Java 热加载吧
1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...
随机推荐
- HALCON数据类型和C#对应数据类型的对比
摘要:HALCON数据类型:Iconic Variables(图形变量).Control Variables(控制变量).在C#中,图形变量用HObject声明,控制变量用HTuple声明.(halc ...
- mysql-5.7.27安装
1,下载5.7.27安装包 百度网盘 (注:5.7.27要安装net faframework4.5.2) 2,创建my.ini及data文件 下载5.7.27后解压,在创建my.ini文件及d ...
- Java 入土之路
概述 变量与数据类型 运算符与方法 面向对象 异常处理 包装类与常量池 集合框架 多线程 网络通讯协议 socket 编程-概念未发布 socket 编程-java环境未发布 web入门 Servle ...
- report framework
大标题 摘要: 关键字: 1 第一题:(爬虫) 1.1 问题分析及解题思路 本题需要爬取xxxx的数据,运用Python的Request爬虫框架 1.2 解题流程及代码 1.2.1定义爬虫类-构造函数 ...
- JVM学习分享-练习题
package org.fenixsoft.clazz; public class TestClass { private int m; public int inc() { return m + 1 ...
- 一个MongoDB索引走偏的案例及探究分析
接业务需求,有一个MongoDB的简单查询,太耗时了,执行了 70S 左右,严重影响用户的体验.. 查询代码主要如下: db.duoduologmodel.find({"Tags.SN&qu ...
- Oracle解析逗号分隔的字符串,或者01110110101此类数据
-- 1.提取此类数据中的1的索引位置,从1开始 例: 0001100001100 --> 4,5,10,11 create or replace function hazq_instr_ ...
- 一天两道pat(3)1007,1008
1007没什么好说的,就是注意暴力求素数的时候,循环到(根号n)+1就好: 重点说说1008,不用新开一个数组就实现循环移位的操作 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下 ...
- java之递归
什么是递归 递归:指在当前方法内调用自己的这种现象. 递归的分类: 递归分为两种,直接递归和间接递归. 直接递归称为方法自身调用自己. 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法 ...
- java之数据结构
数据结构有什么用? 现实世界的存储,我们使用的工具和建模.每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗?而算法,在这么多的数据中如何做 ...