热更新机制的目标是:
(1)更新代码定义
(2)不更新数据对象
(3)不要依赖热更新机制解决所有问题。过于复杂的改动,重启进程
Python的builtins中有一个众所周知的reload,但它在大项目中的可用性几乎为零也是众所周知的。它辜负了Python Documentation中对它的评价:
"This is useful if you have edited the module source file using an external editor and want to try out the new version without leaving the Python interpreter"
这里简单翻译一下Python内建的reload的说明:
当reload(M)被执行后:
-
M模块将被重新解释字节码。并再执行模块级定义的执行语句(译注:由此应认识到在模块级就编写函数调用和类对象生成是多么坏的习惯呀)。并在M模块内定义一个新的 命名->新对象 的命名空间映射。
-
M模块reload前的所有旧对象,直到它们的引用数量降到0,才可能被gc回收。
-
M模块的命名空间中的命名全部指向了新的对象。
-
其他模块中对M模块reload前的旧对象的引用,仍然维持旧对象的引用; 如果你希望其他模块对M模块的相关对象引用能同时更新为M中的新对象, 那需要你自己动手。
Python2 中可以直接使用reload(module)
重载模块。
python会生成新的字节码,从而达到热更新的状态,执行一次就OK.
网友评论