为了账号安全,请及时绑定邮箱和手机立即绑定

在python中缓存一个不改变的经常读取的文件

在python中缓存一个不改变的经常读取的文件

达令说 2023-07-05 17:42:08
好吧,大家让我举例说明,我有这个def get_config_file(file='scrapers_conf.json'):    """    Load the default .json config file    """    return json.load(open(file))这个函数被调用很多,这将在服务器上,每个请求都会触发这个函数至少 5 次,我有多个刮刀在运行,每个刮刀都在以下形状上。为了方便起见,我删除了辅助方法,问题是,每个抓取工具都应该有自己的请求标头、有效负载……或者使用位于的默认标头scrapers_conf.jsonclass Scraper(threading.Thread): # init is overriden and has set .conf    def run(self):        self.get()    def get(self):        # logic问题是我得到的标题像class Scraper(threading.Thread):    def run(self):        self.get()    def get(self):        headers = self.conf.get('headers') or get_config_file().get('headers')正如您所看到的,每个请求的每个实例都会调用 get_config_file() 函数,我认为这在我的情况下不是最佳的。我知道,lru_cache但我不认为这是最佳解决方案(请纠正我!)配置文件很小,os.sys.getsizeof报告不到 1 KB。我正在考虑将其保留,因为考虑到读取 1 KB 不是问题。
查看完整描述

2 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

我完全忘记了@functools.cached_property


@cached_property

def get_config_file(file='scrapers_conf.json'):

    """

    Load the default .json config file

    """

    return json.load(open(file))


查看完整回答
反对 回复 2023-07-05
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

lru_cache(maxsize=None)听起来是正确的方法;maxsize=None通过关闭 LRU 机制可以使其速度更快。

另一种方法是get_config_file()在程序的开头(在__init__get或实例化类的地方)调用,将其分配给每个 Scraper 类上的一个属性,然后始终引用self.config(或其他方式)。这样做的优点是您可以在单元测试中跳过读取配置文件 - 您可以将测试配置直接传递到类中。

在这种情况下,由于该类已经有一个self.conf,因此最好使用文件中的值更新该字典,而不是在每个方法中引用两个位置。


查看完整回答
反对 回复 2023-07-05
  • 2 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信