好吧,大家让我举例说明,我有这个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))
梦里花落0921
TA贡献1772条经验 获得超6个赞
lru_cache(maxsize=None)
听起来是正确的方法;maxsize=None
通过关闭 LRU 机制可以使其速度更快。
另一种方法是get_config_file()
在程序的开头(在__init__
、get
或实例化类的地方)调用,将其分配给每个 Scraper 类上的一个属性,然后始终引用self.config
(或其他方式)。这样做的优点是您可以在单元测试中跳过读取配置文件 - 您可以将测试配置直接传递到类中。
在这种情况下,由于该类已经有一个self.conf
,因此最好使用文件中的值更新该字典,而不是在每个方法中引用两个位置。
添加回答
举报
0/150
提交
取消