python热更新机制的实现_Python代码模块热更新机制实现(reload)

——(转载)https://blog.csdn.net/faithmy509/article/details/52738334

对一个游戏来说,无论是client或server都非常需要一套代码热更新的机制。它能大大提高开发效率,又能超乎玩家期望地在运营期在线修正bug和增添功能。可谓必备机制。

热更新机制的目标是:

(1)更新代码定义

(2)不更新数据对象

(3)不要依赖热更新机制解决所有问题。过于复杂的改动,重启进程

具体到Python这个语言而言,目标便是:

(1)更新类/函数及衍生对象:class/function/method/classmethod/staticmethod

(2)不更新除了(1)中的其他类型对象

(3)不要依赖热更新机制解决所有问题。过于复杂的改动,重启进程

第(3)点将我解救出来了:不要把所有责任压在热更新机制上。

本文所指模块只限于.py/.pyc/.pyo...(即非dll/so/bulitin)为载体的模块。

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中的新对象, 那需要你自己动手。

一些reload函数的注意事项:

* 如果旧的模块M命名空间中的某个命名x在修改后的模块

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值