线程安全复制双端,不阻塞追加



我正在尝试在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 降至零,从而消除了非原子行为的另一个来源。

最新更新