Python 软件热更新
本篇文章涉及技术知识如下:
Redis
threading 多线程
PyQt5importlib 热更新
场景
咱们在平时运行一些长时间都会一直运行的软件(如:某些云同步软件)的时候,某些功能因为考虑的情况可能不充分,导致体验不够好的时候,很多人都会忽视这个问题,除非这个问题影响到他正常使用了。但是也有部分用户会在软件的反馈框里面将问题反馈给开发者,顺带将错误日志也一并提交给开发者。然后过了一天或者半天,你再运行那部分功能的时候,发现问题已经解决了。可是,我们都没有更新软件呀,甚至连软件都没有重启,难道前面遇到的那个情况真的是因为自己太幸运踩中bug了吗?
其实,我们之前遇到的问题,可能的确就是一个bug,但是在反馈问题给开发者后,开发者快速定位问题所在后,通过热更新将问题解决了。相当于我们使用的软件自动fix了一些bug,更新了一次版本。
那么,今天咱们聊一下热更新这个东西怎么样?我们也随意做个小demo看看这个有意思的功能是怎么做到的。
什么是热更新
热更新就是可以在进程不重启的情况下,让其重新加载修改后的程序代码,且能按照预期正确执行。在实际开发中,热更新的最主要用途有,
- 可以提升开发效率,让改动后的代码效果立刻实现,避免频繁重启
- 对于bug修复来说,在CS模式下,如果不是大的bug而是小bug的修复就不用发布比较大的补丁和更新文件了,直接使用服务器修正问题后,通知客户端重新加载修正后代码即可。
Python的代码是通过module进行组织的,所以,对某些功能的热更新就是可以通过对module更新就可以了。
在Python中,如果重新import 一个已经被import的模块时,并不会重新执行import新的模块。所以,在这个时候,我们希望可以重新加载模块的时候,就需要对模块进行删除后,再重新import进来。
而在sys.modules保存了已经加载过的模块。
为了方便看到展示,我就沿用上次客户端的界面,进行简单修改后,展示给大家看,热更新的效果。
左边的按钮是运行模块加载进来的函数,右边的按钮是手动点一下热更新。便于本地手动调试热更新。在后面实现的“发布订阅”情况中,服务端发布更新消息后,不用