我的程序有两个线程-第一个线程以字典列表的形式接收数据,第二个线程将值存储在数据库中。
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
不会两次从双端队列插入相同的数据?
答案 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
特别适合:您可以在不同的一端插入和弹出。
这样做还有一个好处,就是您永远无法两次获得相同的元素。