python代码热更原理及实现

一、简介:

热更,指程序具有在运行过程中修改代码,不重启,而直接生效的能力。

热更对代码的微调,debug非常友好,不再需要重新启动程序,能直接在已有的上下文环境中直接测试。

二、接入流程:

  1. hot_update 文件夹复制到项目根目录
  2. 在程序启动代码里,添加以下代码
  import hot_upate
  hot_update.start()
  1. 启动程序之后,hot_update 文件夹下会自动创建两个 .txt 文件
hot_update
    |-- __init__.py
    |-- update_file.txt *   # 热更新操作文件
    |-- update_log.txt  *   # 日志文件

至此热更环境已配置成功

三、使用:

<说明>

如果需要更新某个文件,只需要在 update_file.txt 文件下写需要更新的文件,在1~2秒的延迟之后,
可检查update_log.txt文件判断是否更新成功

程序会每秒检查 update_file.txt 文件,找到第一个 没有#号的行,然后对其进行热更

<举例>

场景1:

  • 问题:我在 ui.kv.sale.sale_screen 目录下修改了一行代码,怎么热更?如果是多个文件呢?
  • 处理:在 update_file.txt 中写上需要更新的文件(如下),然后保存。
    ui.kv.sale.sale_screen
    
    多个文件以 , 分割
    ui.kv.sale.sale_screen,ui.kv.sale.total_bar
    
    然后查看 update_log.txt 如果出现更新成功提示,则代表成功(如下)
    2022-11-28 16:09:03 更新文件: ui.kv.sale.sale_screen  ok
    

场景2:

  • 问题:我不想每次都输入一遍文件路径,有没有办法?
  • 处理:在对应行随便一个地方加上 #,该行不会被热更,会继续往下寻找第一个没有 # 的行热更
    ui.kv.sale.sale_screen,ui.kv.sale.total_bar #
    

四、原理简单介绍

1、引入reload

python 中有个 reload函数,会对模块进行重新加载,
例如对模块 A 执行,reload(A),则模块 A 中的模块级内容会重新加载。

不过,被reload的模块中,某个类已经生成的对象,依然指向的是旧模块的代码。也就是说,你在某个类的方法中添加了一行打印,
热更之后这些已经存在的对象并不会生效。

2、已存在对象的处理

而这些对象该怎么处理?
首先是需要理解python类函数的执行流程。

对象执行函数,都知道需要传入一个 self,所以理解以下内容应该不是难事:
对象在执行某个函数时,其实是执行的一个普通类函数,然后传入当前对象。

而类函数也是引用的一个普通函数,所以当reload某个模块,将类重新加载之后,需要做到:
仅仅只是更新函数代码,保留类的旧环境(类属性的值等等)

因为已有的对象是指向的旧类,所以其中一种方式就是对新生成的类和旧对象所引用的类进行改造

  1. 旧对象引用的类,将类中的方法引用指向新生成类的方法
  2. 新类指向旧类,使下次创建对象能保留之前类环境

从而做到,仅热跟代码,而保存已有的运行环境

想要了解更多细节,可以看看这篇文章,写的很通俗易懂 传送门

五、后续拓展

1、增加ui

可以再 pos 程序中增加一个ui界面,直接输入需更新的文件,写入 update_file.txt。增加一个线程,定时读取update_log.txt
,将当前的信息展示到界面上,做到实时判断是否更新成功(当然也可以给右下角的非阻塞弹窗提示)

2、热更 .kv 文件

对项目 kv 暂时不太熟悉,不过应该是可行的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STDC是一种基于C语言标准库的模块架构,它的核心思想是将代码按照功能模块划分成多个小模块,每个小模块负责处理一个特定的功能,这些小模块可以独立编译、测试和部署。STDC的模块架构可以让开发者加高效地组织代码,提高代码的可维护性和可重用性。 下面是一个简单的STDC模块架构的示例: ``` stdc/ ├── include/ │ ├── module1.h │ ├── module2.h │ ├── ... ├── src/ │ ├── module1.c │ ├── module2.c │ ├── ... ├── Makefile ├── README.md ``` 在这个示例中,`include`目录包含了所有模块的头文件,`src`目录包含了所有模块的源代码文件。`Makefile`文件用于编译和链接所有模块的代码,生成可执行文件或库文件。 下面是一个简单的STDC模块架构的Python代码实现示例: ``` stdc/ ├── __init__.py ├── module1/ │ ├── __init__.py │ ├── module1.py ├── module2/ │ ├── __init__.py │ ├── module2.py ├── ... ``` 在这个示例中,STDC模块架构被用于Python代码的组织。每个功能模块都被封装在一个独立的目录中,目录下包含了一个`__init__.py`文件和一个或多个Python代码文件。`__init__.py`文件用于定义模块的接口和导出需要暴露的函数和变量。 例如,`module1.py`文件可以定义一个名为`func1`的函数: ```python def func1(): print("This is module1's func1") ``` `__init__.py`文件可以将`func1`函数导出: ```python from .module1 import func1 ``` 这样,在其他Python模块中,可以使用以下语句导入`module1`模块并调用`func1`函数: ```python from stdc.module1 import func1 func1() ``` 总的来说,STDC模块架构的原理是将代码按照功能模块划分成多个小模块,每个小模块负责处理一个特定的功能,这些小模块可以独立编译、测试和部署。在Python中,可以通过创建独立的目录和`__init__.py`文件来实现STDC模块架构。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值