文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

奇门武功:如何实现代码热更新

2024-12-03 06:59

关注

本文转载自微信公众号「小菜学编程」,作者fasionchan。转载本文请联系小菜学编程公众号。  

经过 Python 虚拟机、函数机制和类机制的学习,我们对 Python 程序执行过程的动态性已经了如指掌:

借助这些特性,我们可以实现程序运行时动态更新代码,也就是 代码热更新 !

对于一般程序而言,想要更新代码只有重启一条路。因此,拥有热更新能力的 Python 可以实现很不可思议的功能,具体如何进行呢?—— 我们从猴子补丁说起。

猴子补丁

猴子补丁 ( monkey patch )大家应该都听说过,这是一种在运行时添加、修改代码的技术,而无需修改源码。

json 序列化是一个很常见的操作,在 Python 可以这样进行:

  1. import json 
  2. json.dumps(some_data) 

ujson 是另一个 json 序列化实现,由纯 C 语言编写,效率比标准库中的 json 模块更高,用法一样:

  1. import ujson 
  2. ujson.dumps(some_data) 

那么,如果想把整个程序中的 json 操作都换成 ujson ,该怎么办呢?

直接引用 ujson 肯定是不行的,因为程序可能会引用第三方类库,我们肯定不想也不好改动第三方代码。以一个由 flask 框架实现的 api 为例,

  1. from flask import Flask, jsonify 
  2.  
  3. app = Flask(__name__) 
  4.  
  5. @app.route('/'
  6. def some_api(): 
  7.     return jsonify(some_data) 

jsonify 函数用于响应 json 数据,它调用标准库 json 模块对数据进行 json 序列化,可 flask 并不是我们开发的。

好在,利用 Python 执行过程的动态特性,我们可以在运行时替换 json 模块的相关函数实现。下面,我们编写 patch_json 函数,实现 dumps 和 loads 函数的替换:

  1. import json 
  2. import ujson 
  3.  
  4. def patch_json() 
  5.  json.dumps = ujson.dumps 
  6.     json.loads = ujson.loads 
  7.  
  8. patch_json() 

这样一来,只要 patch_json 函数成功执行,json 模块中的 dumps 、loads 函数就被换成了 ujson版本。后续就算从 json 模块导入,最终得到的也是 ujson 版本!


 

 

需要特别注意,json 模块属性在 patch_json 调用前就被直接引入,将不受 patch_json 控制:

  1. import json 
  2. from json import dumps 
  3.  
  4. patch_json() 
  5.  
  6. # 执行 json 模块原来的版本,而不是 ujson 版本 
  7. dumps(some_data) 
  8. # 执行 ujson 版本 
  9. json.dumps(some_data) 

 

因此,许多应用猴子补丁的程序,在开头处便要执行替换逻辑,确保类似的现象不会发生。

猴子补丁的应用范围很广,一般用来特换类库实现或者在单元测试中进行 mock 。诸如greenlet 采用猴子补丁将阻塞的库函数替换成非阻塞的版本:

  1. import gevent.monkey 
  2. gevent.monkey.patch_all() 

由于猴子补丁可能会影响代码的可读性,应用不当可能导致一些奇怪的问题,因此不能滥用。

实际上,除了猴子补丁,Python 还提供了 reload 函数,用于重新加载模块。那么,我们应该如何使用 reload 函数呢?它有哪些局限性吗?

来源:小菜学编程内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯