我正在尝试在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个元素。这就是为什么我要使用这个互斥锁。
问题是我不想在其他线程将数据复制到缓冲区时阻止新元素的插入。
是否有一种无需互斥体即可实现此行为的方法?
答案 0 :(得分:0)
在CPython中,此副本是原子副本(一旦开始运行):
s = list(islice(some_deque, 20))
列表构建,使用itertools切片和双端队列迭代均在C中实现,没有纯python回调。此外,复制操作不会使任何DECREF降至零,从而消除了另一个非原子行为的来源。