粗略地讲一下个人对Python服务器Hotfix的理解
1.Hotfix期望目标
- Python服务器不停机
- 不需要重新赋值实例的__class__
- 不需要重新赋值module
基于上面的期望目标,需要怎样实现Hotfix?
2.Hotfix基本思路
怎样保持Module的引用不变
方案1
最容易想到的就是reload方法,其实reload方法内部实现也是分别调用find_module和load_module两个方法,在load_module方法中如果sys.module中存在需要加载的Module,那么加载module的内容是在老module的基础上加载的。这样我们会发现reload前后module的id是相同的。
方案2
单独调用imp.find_module方法和imp.load_module两个方法,当然前提也是要加载的Module在sys.module中存在。
Class不替换而是修改内部的function
方案1
此方案是基于Module不变的方案1来做的,在reload之前,保存老的module的__dict__内容,然后reload之后,去尝试更新老的__dict__中的方法,并将其再次赋值给新的module。
方案2
此方案也对应Module不变的方案2来做的,我们需要利用sys.meta_path来hook住Python的find_module函数(原因我在这里讲过),从而在import的过程中尝试替换新的module的Class和Function。
3.小结
上面说的都很抽象,原因是上面的有些思路工作在用,不愿意具体讲,其次这里只是做一些个人的理解,等着合适的时候写一个Python服务器Hotfix的功能模块。