模块函数自行读取配置文件是否会引发重复磁盘IO问题咨询
配置文件读取优化方案疑问解答
场景说明
我的代码包含三个核心文件:
config.yml:存储连接地址、端口等配置信息modules/fetchers.py:包含多个从API获取内容的函数,依赖config.yml里的连接信息main.py:调用fetchers.py中的函数
当前实现是main.py读取config.yml,每次调用fetchers的函数时把配置作为参数传入。现在想改成让fetchers.py自行读取配置,避免每次传参,但有疑问:
这样做的话,每次调用
fetchers的函数时都会读取配置文件吗?调用两次是否会触发两次磁盘IO,产生额外开销?
解答
完全可以让fetchers.py自行读取配置,而且不会每次调用函数都触发磁盘IO,只要做一次缓存处理就行,具体有两种常用实现方式:
1. 模块级缓存(最常用)
在fetchers.py里把配置读取逻辑放在模块顶层,模块加载时只会执行一次,后续函数调用直接用缓存好的配置:
# modules/fetchers.py import yaml # 模块加载时读取一次配置,缓存到全局变量 with open('config.yml', 'r') as f: _config = yaml.safe_load(f) def fetch_api_data_1(): # 直接使用缓存的_config url = f"{_config['api_url']}/endpoint1" # 后续请求逻辑... def fetch_api_data_2(): url = f"{_config['api_url']}/endpoint2" # 后续请求逻辑...
模块在Python中是单例的,第一次导入时执行顶层代码读取配置,之后无论调用多少次函数,都只会用已经加载到内存里的_config,不会重复读磁盘。
2. 函数级缓存(适合动态更新场景)
如果需要偶尔刷新配置(比如配置文件修改后不用重启程序),可以用functools.lru_cache或者自己实现缓存逻辑:
# modules/fetchers.py import yaml from functools import lru_cache @lru_cache(maxsize=1) def get_config(): with open('config.yml', 'r') as f: return yaml.safe_load(f) def fetch_api_data_1(): config = get_config() url = f"{config['api_url']}/endpoint1" # 后续请求逻辑... # 要刷新配置时调用这个函数 def refresh_config(): get_config.cache_clear()
这种方式第一次调用get_config()会读磁盘,之后调用直接返回缓存结果;需要更新时清除缓存即可重新读取。
两种方案对比
- 模块级缓存:实现最简单,性能最优,适合配置不会动态修改的场景
- 函数级缓存:稍复杂,但支持配置动态刷新,适合需要热更新配置的场景
不管用哪种方式,都能避免每次调用函数都读磁盘的问题,同时省去了在main.py里到处传递配置参数的麻烦。
内容的提问来源于stack exchange,提问作者IceBlast
相关产品推荐
相关产品推荐

