首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中缓存不变的频繁读取文件

在python中缓存不变的频繁读取文件
EN

Stack Overflow用户
提问于 2020-09-01 20:13:01
回答 2查看 53关注 0票数 0

好了,朋友们,让我来说明一下,我有这个

代码语言:javascript
复制
def get_config_file(file='scrapers_conf.json'):
    """
    Load the default .json config file
    """
    return json.load(open(file))

这个函数被调用了很多,这将在一个服务器上,每个请求都会触发这个函数至少5次,我有多个抓取器在运行,每个都在下面的形状上。

为了方便起见,我去掉了帮助器方法,但问题是,每个刮除器都应该有自己的请求头、有效负载……或者使用scrapers_conf.json中的默认设置

代码语言:javascript
复制
class Scraper(threading.Thread): # init is overriden and has set .conf
    def run(self):
        self.get()

    def get(self):
        # logic

问题是我得到了像这样的标题

代码语言:javascript
复制
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。

我正在考虑让它保持原样,考虑到读取1KB不是问题。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-08 22:51:11

我已经完全忘记了@functools.cached_property

代码语言:javascript
复制
@cached_property
def get_config_file(file='scrapers_conf.json'):
    """
    Load the default .json config file
    """
    return json.load(open(file))
票数 0
EN

Stack Overflow用户

发布于 2020-09-01 20:23:20

lru_cache(maxsize=None)听起来是做这件事的正确方法;maxsize=None通过关闭LRU机制使它更快。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63687427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档