好了,朋友们,让我来说明一下,我有这个
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。
我正在考虑让它保持原样,考虑到读取1KB不是问题。
提前谢谢。
发布于 2020-09-08 22:51:11
我已经完全忘记了@functools.cached_property
@cached_property
def get_config_file(file='scrapers_conf.json'):
"""
Load the default .json config file
"""
return json.load(open(file))发布于 2020-09-01 20:23:20
lru_cache(maxsize=None)听起来是做这件事的正确方法;maxsize=None通过关闭LRU机制使它更快。
另一种方法是在程序开始时(在__init__、get或实例化类的地方)调用get_config_file(),将其分配给每个Scraper类上的属性,然后始终引用self.config (或其他任何类型)。这样做的好处是,您可以跳过在单元测试中读取配置文件-您可以将测试配置直接传递到类中。
在这种情况下,因为类已经有了self.conf,所以最好用文件中的值更新该字典,而不是引用每个方法中的两个位置。
https://stackoverflow.com/questions/63687427
复制相似问题