关于Python服务器Hotfix的个人理解

粗略地讲一下个人对Python服务器Hotfix的理解

1.Hotfix期望目标

  1. Python服务器不停机
  2. 不需要重新赋值实例的__class__
  3. 不需要重新赋值module

基于上面的期望目标,需要怎样实现Hotfix?

2.Hotfix基本思路

怎样保持Module的引用不变

方案1

最容易想到的就是reload方法,其实reload方法内部实现也是分别调用find_moduleload_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的功能模块。