使用collections.deque实现线程安全的队列操作
在Python中,collections.deque是一个双向队列(double-ended queue),具有线程安全的特性。它可以在队列的两端进行插入和删除操作,并且具有O(1)的复杂度。
下面是一个简单的使用collections.deque实现线程安全队列的例子:
import threading
import time
from collections import deque
class ThreadSafeQueue:
def __init__(self):
self.queue = deque()
self.lock = threading.Lock()
def enqueue(self, item):
with self.lock:
self.queue.append(item)
def dequeue(self):
with self.lock:
if len(self.queue) > 0:
return self.queue.popleft()
else:
return None
def producer(queue):
for i in range(5):
item = f"Item {i}"
print(f"Producing {item}")
queue.enqueue(item)
time.sleep(1)
def consumer(queue):
while True:
item = queue.dequeue()
if item is None:
break
print(f"Consuming {item}")
time.sleep(2)
if __name__ == "__main__":
queue = ThreadSafeQueue()
producer_thread = threading.Thread(target=producer, args=(queue,))
consumer_thread = threading.Thread(target=consumer, args=(queue,))
producer_thread.start()
consumer_thread.start()
producer_thread.join()
consumer_thread.join()
在上述例子中,ThreadSafeQueue是一个简单的线程安全队列类,它使用collections.deque作为内部存储的数据结构,并使用threading.Lock来保证线程安全性。它包含了enqueue和dequeue两个方法,用于在队列的尾部添加元素和从队列的头部取出元素。
producer函数是生产者线程的工作函数,它会循环5次,每次向队列中添加一个元素。在添加元素之前,它会打印出要添加的元素信息,并调用enqueue方法将元素加入队列中,并通过time.sleep方法让线程休眠1秒。
consumer函数是消费者线程的工作函数,它会循环执行,不断从队列中取出元素,直到队列为空。在取出元素之后,它会打印出取出的元素信息,并调用time.sleep方法让线程休眠2秒。
在if __name__ == "__main__":部分,则是主线程的代码。它创建了一个ThreadSafeQueue对象,并创建了两个线程:一个生产者线程和一个消费者线程,分别执行生产者函数和消费者函数。最后,它通过start方法启动线程,并通过join方法等待线程执行完毕。
通过collections.deque和threading.Lock的组合,我们实现了一个线程安全的队列,并使用生产者消费者模型进行了示例。这个例子展示了如何使用collections.deque实现线程安全的队列操作,并通过多线程实现生产者消费者模型来演示队列的使用。
