python watchdog 配置文件热更新

news2024/7/11 14:54:07

目录

一、Watchdog示例

二、aiohttp服务配置热更新


         在同事的golang代码中学习到了config.json热更新的功能,这里自己也学习了一下python写web服务的时候怎么来实现配置的热更新。主要是利用Watchdog这个第三方python库,来监控文件系统的改变,从而实现不用重启代码热更新的功能。

一、Watchdog示例

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class HotUpdateEventHandler(FileSystemEventHandler):
    def on_created(self, event):
        if event.is_directory:
            return
        print(f'File created: {event.src_path}')

    def on_modified(self, event):
        if event.is_directory:
            return
        print(f'File modified: {event.src_path}')


if __name__ == "__main":
    path = "/root"  # 检测根目录下文件和目录的改变
    # 处理器
    event_handler = HotUpdateEventHandler()
    # 监控器
    observer = Observer()
    observer.schedule(event_handler, path, recursive=False)
    observer.start()
    try:
        while True:
            # 其他的功能逻辑
            do_something()
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

流程:

1、定义事件处理器(文件的修改、删除等对应逻辑)

2、定义监控器

3、监控器中执行调度,传入事件处理器、监控路径和是否递归监控

重要的两个class

watchdog.observers.Obsever

watchdog.events.FileSystemEventHandler

Obsever发起监控线程,FileSystemEventHandler实现具体的文件系统变化的逻辑

在实现具体的功能的时候,需要自己重写FileSystemEventHandler中的方法

主要常用的就是以上的方法

其中event具有的属性如下

二、aiohttp服务配置热更新

import json
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import aiohttp
from aiohttp import web
import os
config_path = "./test.json"
config = json.load(open(config_path))


def reload_config():
    """热重载配置"""
    global config
    try:
        new_config = json.load(open(config_path))
        print('Config reloaded successfully.')
        config = new_config
    except Exception as e:
        print(f'Failed to reload config: {e}')

class ConfigReloadEventHandler(FileSystemEventHandler):
    def on_modified(self, event):
        if event.src_path == config_path:
            print(f"Config file modified: {event.src_path}. Reloading...")
            reload_config()


async def post(request:web.Request):
    req = await request.json()
    send_data = config
    return web.json_response(send_data)


async def main():
    app = web.Application()
    app.add_routes([
        web.post('/nlp', post)
    ])
    return app

# 使用方法
if __name__ == "__main__":
    config_event_handler = ConfigReloadEventHandler()
    path, filename = os.path.split(config_path)
    observer = Observer()
    observer.schedule(config_event_handler,path,recursive=False)
    observer.start()
    try:
        local_ip = "0.0.0.0"
        port = "6666"
        web.run_app(main(), port=port)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

使用aiohttp启动一个web 服务,同时热更新test.json配置文件,作为全局变量config在web服务中使用

test.json内容

{"name":"huangyang"}

请求结果

修改test.json文件内容

{"name":"huangyang_new"}

再次请求结果为

服务端日志

参考文章

watchdog 2.1.5 documentation

解密Python Watchdog:实时监控文件系统的终极解决方案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1850566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谷歌主页归属地确认使用的什么接口?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

CPU飙升100%怎么办?字节跳动面试官告诉你答案!

小北说在前面 CPU占用率突然飙升是技术人员常遇到的一个棘手问题,它是一个与具体技术无关的普遍挑战。 这个问题可以很简单,也可以相当复杂。 有时候,只是一个死循环在作祟。 有时候,是死锁导致的。 有时候,代码中有…

【项目管理】项目管理表单(excel)

PM项目管理模板 甘特图 OKR周报 团队任务 工作总结

Aquila-Med LLM:开创性的全流程开源医疗语言模型

​论文链接:https://arxiv.org/pdf/2406.12182 开源链接:https://huggingface.co/BAAI/AquilaMed-RL http://open.flopsera.com/flopsera-open/details/AquilaMed_SFT http://open.flopsera.com/flopsera-open/details/AquilaMed_DPO 近年来&#xf…

Android设置页面Activity全屏(隐藏导航栏、状态栏)

3、代码中设置:在setContentView 之前调用 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 注意: 当有全面屏手机可以显示虚拟…

认识LogBack.xml

一、logback的三个主要模块 1.logback-core:提供基本的日志功能; 2.logback-classic:建立在logback-core之上,兼容SLF4和log4jAPI,提供一套强大的日志框架; 3.logback-access:允许通过servlet容…

BP神经网络的反向传播(Back Propagation)

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、什么是BP的反向传播1.1 什么是反向传播1.2 反向传播的意义 二、BP神经网络如何通过反向传播计算梯度三、BP梯度公式解读 BP神经网络更原始的名称是"多层线性感知机MLP",由于它在训练时…

Ubuntu22.04开机后发现IP地址变成127.0.0.1

开机就是这个样子 解决办法 ip地址可能被释放,需要重新设置成自动分配 sudo dhclient -v可能网卡未加托管 查看方式: nmcli n若是enable就是已被托管,若是disabled,说明网卡未被托管 解决办法: nmcli n on搞定

Dockerfile实战

Dockerfile是用来快速创建自定义镜像的一种文本格式的配置文件,在持续集成和持续部署时,需要使用Dockerfile生成相关应用程序的镜像。 Dockerfile常用命令 FROM:继承基础镜像MAINTAINER:镜像制作作者的信息,已弃用&a…

【数据结构与算法】树的遍历,森林遍历 详解

树的先根遍历、后根遍历对应其二叉树的哪种遍历 树的先根遍历对应其二叉树的先序遍历(根-左-右)。树的后根遍历对应其二叉树的中序遍历(左-根-右)。 森林的先根遍历、中根遍历对应其二叉树的哪种遍历? 森林的先根遍历对应其二…

详解Spring AOP(一)

目录 1. AOP概述 2.Spring AOP快速入门 2.1引入AOP依赖 2.2编写AOP程序 3.Spring AOP核心概念 3.1切点(PointCut) 3.2连接点(Join Point) 3.3通知(Advice) 3.4切面(Aspect) …

高考学计算机专业的小白指南,一些比较实用的软件,快速入手计算机

计算机指南 哈喽,首先先和大家分享一下之前我用电脑觉得还行的使用方法吧 这里的方法其实是受MIT计算机课教程的启发然后和自己使用计算机过程中得出来的经验结论 所以有错的地方欢迎大家指出,感谢 那么,我们就开始吧~~~ 杀毒软件 一款…

基本循环神经网络(RNN)

RNN背景:RNN与FNN 在前馈神经网络中,信息的传递是单向的,这种限制虽然使得网络变得更容易学习,但在一定程度上也减弱了神经网络模型的能力。 在生物神经网络中,神经元之间的连接关系要复杂的多。前馈神经网络可以看着…

智慧校园综合管理系统的优点有哪些

在当今这个信息化飞速发展的时代,智慧校园综合管理系统正逐步成为教育领域的一股革新力量,它悄然改变着我们对传统校园管理的认知。这套系统如同一个无形的桥梁,将先进的信息技术与学校的日常运作紧密相连,展现出多维度的优势。 …

你好,复变函数2.0

第一行&#xff1a;0 或 1 第二行&#xff1a;&#xff08;空格&#xff09;函数&#xff08;后缀&#xff09; #pragma warning(disable:4996) #include <easyx.h> #include <stdio.h> #include <math.h> #define PI 3.141592653589793 #define E 2.71828…

基于MATLAB仿真LFM线性调频信号

基于MATLAB仿真LFM线性调频信号 目录 前言 一、LFM信号简介 二、LFM信号基本原理 三、LFM信号仿真 四、代码 总结 前言 仿真中的接收信号&#xff0c;有时为了简单会直接用一个正弦波代替&#xff0c;但实际中接收到的信号极少是点频信号&#xff0c;一般都是PSK信号、OF…

Zigbee协议详解:低功耗无线通信的理想选择

什么是Zigbee协议 Zigbee是一种基于IEEE 802.15.4标准的无线通信协议&#xff0c;专为低功耗、低数据速率和短距离通信设计。它广泛应用于物联网&#xff08;IoT&#xff09;设备&#xff0c;如智能家居、工业自动化和健康监测等领域。Zigbee协议由Zigbee联盟维护和推广&#x…

国企:2024年6月中国移动相关招聘信息

中国移动研究院: AI中心-大模型数据工程师 工作地点:北京市、西安市2 发布时间 :2024-06-18 学历要求:硕士研究生及以上 招聘人数:招聘若干人 专业要求 计算机、人工智能、软件工程、数学等相关专业 工作职责 1、负责处理和清洗大规模、多来源的数据集,保证数…

yum的概念、相关命令、ftp http部署步骤;NFS共享文件操作步骤

目录 yum 配置文件 缓存功能操作步骤 创建并配置本地仓库文件 yum相关命令 yum install __ yum repolist yum list __ yum info __ yum search __ yum whatprovides __ yum remove __ yum -y update __ yum history yum grouplist yum groupinstall "__&q…

【Netty】nio阻塞非阻塞Selector

阻塞VS非阻塞 阻塞 阻塞模式下&#xff0c;相关方法都会导致线程暂停。 ServerSocketChannel.accept() 会在没有建立连接的时候让线程暂停 SocketChannel.read()会在没有数据的时候让线程暂停。 阻塞的表现就是线程暂停了&#xff0c;暂停期间不会占用CPU&#xff0c;但线程…