如何在双端队列正在被另一个线程修改的双端队列中存储和访问值?

时间:2018-10-12 09:12:35

标签: python python-3.x multithreading

我的程序有两个线程-第一个线程以字典列表的形式接收数据,第二个线程将值存储在数据库中。

buffer = collections.deque(maxlen=10)

def process_ticks(bufferarg):
   while True:
       for i in bufferarg:
            #code to insert data in a database

#this tread receives the data and dumps it into a deque with a specified length (so it can function as a circular buffer)
t1 = threading.Thread(target=socket.connect)

#this threads accesses the deque and processes the data
t2 = threading.Thread(target=process_ticks(buffer))

t1.start()
t2.start()

但是,当我运行代码时,出现“双端队列被突变”错误。 另外,如何确保线程无限运行,但是process_ticks不会两次从双端队列插入相同的数据?

1 个答案:

答案 0 :(得分:2)

在某些事物上进行变异时,迭代通常是不明确的。这正是您所遇到的情况:t1更改了缓冲区,而t2对其进行了迭代。

问题在于,迭代假设项目之间存在很强的关系;突变可能会打破这一点。具体来说,deque迭代器在删除元素时可能会保留该元素,从而使对下一个元素的引用无效。

一个简单的解决方案不是使用迭代,而是一次删除一个元素:

def process_ticks(bufferarg):
    while True:
        try:
            # get and remove one item from the end of the deque
            item = bufferarg.popleft()
        except IndexError:
            # no data in buffer, try again immediately or sleep a little
            continue
        else:
            # do something with item

deque特别适合:您可以在不同的一端插入和弹出。 这样做还有一个好处,就是您永远无法两次获得相同的元素。