我无法确定以下双端队列是否是线程安全的。
简而言之,我创建了一个带有 deque 的类,它每 1 秒在一个新线程中显示其内容(因此它不会在打印时暂停主程序)。
双端队列是从主线程填充的,所以基本上应该有碰撞的机会。
但是,双端队列是使用类方法填充的,因此本质上它是从实例本身内部访问的,因此是从同一个线程访问的。
这是简化的代码:
import threading
import time
from collections import deque
class MyQueue(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.q = deque()
self.start()
def run(self):
# pop out queue items every 1 sec
# (please ignore empty deque for now)
while True:
print self.q.popleft()
time.sleep(1)
def add_to_q(self, val):
# this function is called from outside
self.q.append(val)
# main
# fill the queue with values
qu = MyQueue()
for i in range(1:100):
qu.add_to_q(i)
那么,虽然从队列中添加和删除项目是在实例内部进行的,但是从实例外部调用添加函数是否存在风险?
编辑:
因为我需要修改双端队列中的项目,所以我不得不使用双端队列。我所做的是:对给定的项目进行 roatate(),将其弹出,修改,将其推回并 rotate() 将其返回到其原始位置。
除非我找到一种在队列中实现修改项目的方法,否则我将不得不坚持使用 Deque
原文由 user1102018 发布,翻译遵循 CC BY-SA 4.0 许可协议
Deque 是线程安全的 ( http://docs.python.org/library/collections.html#deque-objects ),用于从对面追加和弹出。 在这里下面,文档只提到 append() 和 popleft() 是线程安全的。
Queue 本身有一个线程安全的实现。所以除非你有一些奇怪的要求,否则你应该使用它。