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 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...
随机推荐
- C语言笔记 04_运算符
运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C 语言内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 算术运算符 ...
- 简单了解一下:var 、let、const
var 重新赋值,重新定义,作用域 属于:function scope: let 声明的变量只在 let 命令所在的代码块内有效,Block scope. const 声明一个只读的常量,一旦声明,常 ...
- sleuth和zipkin微服务里的链路跟踪
分布式链路跟踪介绍 对于一个微服务系统,大多数来自外部的请求都会经过数个服务的互相调用,得到返回的结果,一旦结果回复较慢或者返回了不可用,我们就需要确定是哪个微服务出了问题.于是就有了分布式系统调用跟 ...
- Redis面试篇 -- Redis常见性能问题和解决方案?
master最好不要做任何的持久化工作,如RD内存快照或者AOF日志文件: 如果数据比较重要,某个slave开始AOF备份数据,策略设置为每秒同步1次: 为了主从复制的速度和连接的稳定性,master ...
- dpwwn: 1 Vulnhub Walkthrough
主机层面扫描: ╰─ nmap -p1-65535 -sV -A 10.10.202.130 22/tcp open ssh OpenSSH 7.4 (protocol 2.0) 80/ ...
- Chrome是老大,Firefox 是老二,Edge 不是老三
NetMarketShare 是全球最大的电子消费市场调研机构,根据 NetMarketShare 提供的统计数据显示,来自七月份的报告,谷歌的 Chrome 在全球台式浏览器排名上仍居榜首,该公司保 ...
- AWS SNS 创建 订阅 发布
AWS SNS 创建 订阅 发布 20180810 chenxin 为实现短信报警,添加以下SNS的短信(SMS)订阅 选择主题,创建新主题,或修改原有主题 进入对应主题后,选择创建订阅,选择SMS, ...
- ORA-27468: ""."" is locked by another process
You have a scheduler job that generated an error. When the error occurred, you attempted to disable ...
- MS SQL 设置自增长字段默认值
dbcc checkident(tablename,reseed,value) 其中tablename为你所要修改的表名,value为默认值.比如你要设置自增长字段值从1开始,则: )
- Python通过pymysql连接数据库并进行查询和更新SQL方法封装
1.通过pymysql连接数据库并进行数据库操作2.查询数据3.更新修改SQL方法封装 import pymysql.cursors import json class OperationMysql: ...