Python中的rqQueue()简介及使用示例
Queue是Python中的一个线程安全(包含锁机制)的队列类,用于在多线程编程中进行线程间的数据传递。
queue.Queue类是一个基于Python内置的list的实现,它提供了一组线程安全的方法用于放入(put)和取出(get)数据。Queue的特点是先进先出(FIFO)顺序,即最先放入的元素最先被取出。
使用Queue的好处是可以避免线程间的数据竞争问题,因为Queue提供了内部的锁机制来保证线程安全。
下面是Queue类的一些常用方法:
- put(item[, block[, timeout]]):向队列中放入一项(item),如果队列已满且block=True(默认值),则会阻塞直到有空间;如果队列已满且block=False,则会立即抛出queue.Full异常;如果指定了timeout,则会阻塞指定的时间,超时后仍未有空间则抛出queue.Full异常。
- get([block[, timeout]]):从队列中取出一个项,并从队列中删除该项,如果队列为空且block=True(默认值),则会阻塞直到有项可取;如果队列为空且block=False,则会立即抛出queue.Empty异常;如果指定了timeout,则会阻塞指定的时间,超时后仍无项可取则抛出queue.Empty异常。
- empty():返回队列是否为空的布尔值。
- full():返回队列是否已满的布尔值。
- qsize():返回队列中目前的项数。
以下是一个使用Queue的简单示例:
import queue
import threading
# 创建一个队列
my_queue = queue.Queue(3)
# 定义一个生产者函数
def producer():
# 将元素放入队列
for i in range(5):
my_queue.put(i)
print(f"Producer put item {i} into queue")
# 延时一段时间
threading.Event().wait(1)
# 定义一个消费者函数
def consumer():
while True:
# 从队列中取出一个元素
item = my_queue.get()
print(f"Consumer get item {item} from queue")
# 延时一段时间
threading.Event().wait(2)
# 标记该项已被处理完
my_queue.task_done()
# 创建一个生产者线程
producer_thread = threading.Thread(target=producer)
# 创建两个消费者线程
consumer_thread1 = threading.Thread(target=consumer)
consumer_thread2 = threading.Thread(target=consumer)
# 启动线程
producer_thread.start()
consumer_thread1.start()
consumer_thread2.start()
# 等待所有线程执行完毕
producer_thread.join()
consumer_thread1.join()
consumer_thread2.join()
在上面的示例中,我们首先创建了一个最大容量为3的队列my_queue。然后定义了一个生产者函数producer和一个消费者函数consumer。
生产者函数通过put方法将元素放入队列中,消费者函数通过get方法从队列中取出元素。消费者函数每次取出一个元素后,在处理完该元素后调用task_done方法标记该项已被处理完。
在程序的最后,我们创建了一个生产者线程producer_thread和两个消费者线程consumer_thread1和consumer_thread2,然后启动这些线程。最后,我们使用join方法等待所有线程执行完毕,从而保证程序的完整性。
需要注意的是,Queue类在多线程编程中使用较多,而在多进程编程中可以使用multiprocessing.Queue类。
