You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

模块函数自行读取配置文件是否会引发重复磁盘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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:45:57