gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:15:29 25 4
gpt4 key购买 nike

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

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()

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

最佳答案

在某物发生变异时迭代通常是不明确的。这正是您的情况: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 特别适用于此:您可以在不同的端插入和弹出。这具有额外的优势,即您永远不会两次获得相同的元素。

关于python - 如何在双端队列被另一个线程修改的情况下存储和访问双端队列中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52776164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com