我正在尝试在python中创建一个循环缓冲区。我最好的实现是使用固定长度的deque
。
(基本实现(
class RingBuffer(object):
def __init__(self, size):
self.mutex = Lock()
self.deque = collections.deque(maxlen=size)
def push_elem(self, element):
copy.deepcopy(element)
with self.mutex:
self.deque.append(element)
def get_data(self, event, callback=None):
with self.mutex:
return copy.deepcopy(list(self.deque))
def get_elem(self):
if self.deque:
with self.mutex:
return cp.deepcopy(self.deque[-1])
return None
我知道从两侧附加和删除元素是线程安全的,但我还需要能够复制 N 个元素。这就是我使用这个互斥锁的原因。
问题是我不想在其他线程复制缓冲区中的数据时阻止新元素的插入。
有没有办法在没有互斥锁的情况下实现此行为?
在CPython中,这个副本是原子的(一旦它开始运行(:
s = list(islice(some_deque, 20))
列表构建、迭代工具切片和 deque 迭代都是用 C 实现的,没有纯 python 回调。 此外,复制操作不会导致任何 DECREF 降至零,从而消除了非原子行为的另一个来源。