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

好吧,大家让我举例说明,我有这个


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

    """

    Load the default .json config file

    """

    return json.load(open(file))

这个函数被调用很多,这将在服务器上,每个请求都会触发这个函数至少 5 次,我有多个刮刀在运行,每个刮刀都在以下形状上。


为了方便起见,我删除了辅助方法,问题是,每个抓取工具都应该有自己的请求标头、有效负载……或者使用位于的默认标头scrapers_conf.json


class 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 不是问题。


达令说
浏览 120回答 2
2回答

炎炎设计

我完全忘记了@functools.cached_property@cached_propertydef get_config_file(file='scrapers_conf.json'):    """    Load the default .json config file    """    return json.load(open(file))

梦里花落0921

lru_cache(maxsize=None)听起来是正确的方法;maxsize=None通过关闭 LRU 机制可以使其速度更快。另一种方法是get_config_file()在程序的开头(在__init__、get或实例化类的地方)调用,将其分配给每个 Scraper 类上的一个属性,然后始终引用self.config(或其他方式)。这样做的优点是您可以在单元测试中跳过读取配置文件 - 您可以将测试配置直接传递到类中。在这种情况下,由于该类已经有一个self.conf,因此最好使用文件中的值更新该字典,而不是在每个方法中引用两个位置。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python