
656
|
第
22
章
示例
22-16
在
__init__
中定义存储数据的属性,利用键共享优化措施
class Event(Record):
def __init__(self, **kwargs):
self.__speaker_objs = None
super().__init__(**kwargs)
# 省略15行...
@property
def speakers(self):
if self.__speaker_objs is None:
spkr_serials = self.__dict__['speakers']
fetch = self.__class__.fetch
self.__speaker_objs = [fetch(f'speaker.{key}')
for key in spkr_serials]
return self.__speaker_objs
示例
22-15
和示例
22-16
用到的缓存技术在遗留的
Python
基准代码中十分常见。然而,
在多线程程序中,像这样自己实现的缓存容易引入竞争条件,导致数据损坏。如果两个线
程同时读取一个尚未缓存的特性,那么第一个线程需要把计算得到的数据存入缓存属性
(本例中的
__speaker_objs
)名下,当第二个线程从缓存中读取数据时,计算过程可能还
未结束。
幸好,
Python 3.8
引入了对线程安全的
@functools.cached_property
装饰器。然而,使用这
个装饰器时有一些注意事项, ...