欢迎访问宙启技术站
智能推送

使用collections.deque实现线程安全的队列操作

发布时间:2023-12-15 17:00:02

在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来保证线程安全性。它包含了enqueuedequeue两个方法,用于在队列的尾部添加元素和从队列的头部取出元素。

producer函数是生产者线程的工作函数,它会循环5次,每次向队列中添加一个元素。在添加元素之前,它会打印出要添加的元素信息,并调用enqueue方法将元素加入队列中,并通过time.sleep方法让线程休眠1秒。

consumer函数是消费者线程的工作函数,它会循环执行,不断从队列中取出元素,直到队列为空。在取出元素之后,它会打印出取出的元素信息,并调用time.sleep方法让线程休眠2秒。

if __name__ == "__main__":部分,则是主线程的代码。它创建了一个ThreadSafeQueue对象,并创建了两个线程:一个生产者线程和一个消费者线程,分别执行生产者函数和消费者函数。最后,它通过start方法启动线程,并通过join方法等待线程执行完毕。

通过collections.dequethreading.Lock的组合,我们实现了一个线程安全的队列,并使用生产者消费者模型进行了示例。这个例子展示了如何使用collections.deque实现线程安全的队列操作,并通过多线程实现生产者消费者模型来演示队列的使用。