线程安全地复制双端队列而不会阻止附加

时间:2019-06-18 14:49:48

标签: python multithreading deque

我正在尝试在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个元素。这就是为什么我要使用这个互斥锁。
问题是我不想在其他线程将数据复制到缓冲区时阻止新元素的插入。
是否有一种无需互斥体即可实现此行为的方法?

1 个答案:

答案 0 :(得分:0)

在CPython中,此副本是原子副本(一旦开始运行):

s = list(islice(some_deque, 20))

列表构建,使用itertools切片和双端队列迭代均在C中实现,没有纯python回调。此外,复制操作不会使任何DECREF降至零,从而消除了另一个非原子行为的来源。