queue模块提供了多种队列,那么它主要是用于多线程编程中的数据共享。
我们都知道同一进程下的数据是能被多个线程共享的,那么为什么这些线程在同一进程下还去使用队列呢?
所以使用队列来存放多个线程中用于共享的数据还是为了保证其数据的安全性。
queue模块中的队列主要是用于本地测试中使用,正式上线时还得要使用Redis,这个是后话,我们先来看关于queue模块的使用。
方法大全
| queue模块中的队列方法大全 | |
|---|---|
| 方法名称 | 功能描述 |
| Queue.qsize() | 返回当前队列的大小 |
| Queue.empty() | 判断当前队列是否为空 |
| Queue.full() | 判断当前队列是否已满 |
| Queue.put(item, block=True, timeout=None) | 将item放入队列中,block参数为如果要操作的队列目前已满是否阻塞,timeout为超时时间。 |
| Queue.put_nowait(item) | 相当于 put(item, False),如果操作的队列已满则不进行阻塞,而是抛出Full异常。 |
| Queue.get(block=True, timeout=None) | 将项目从队列中取出,block参数为如果要操作的队列目前为空是否阻塞,timeout为超时时间。 |
| Queue.get_nowait() | 相当于 get(False),如果要操作的队列为空则不进行阻塞,而是抛出Empty异常。 |
| Queue.task_done() | 当消费者线程被join()阻塞后,生产者线程调用此方法会停止消费者线程的阻塞状态。详情请见下面补充 |
| Queue.join() | 当消费者线程被join()阻塞后,需等待消费者线程调用task_done()方法后方可停止阻塞。详情请见下面的补充 |
| 注意:如遇到异常情况请查看官方文档,这个模块的方法比较特殊 | |
三种不同的队列
在queue模块中,提供了三种队列。如下:
queue.Queue:先进先出队列
queue.LifoQueue:先进后出队列
queue.PriorityQueue:优先级队列
import queue # ==== 先进先出队列 ==== q1 = queue.Queue(maxsize=5) # 该队列最大可存放5个项目 q1.put(1) # 入队操作 q1.put(2) q1.put(3) print(q1.get()) # 出队操作 print(q1.get()) print(q1.get()) # ==== 执行结果 ==== """ 1 2 3 """ # ==== 先进后出队列 ==== q2 = queue.LifoQueue(maxsize=5) # 该队列最大可存放5个项目 q2.put(1) # 入队操作 q2.put(2) q2.put(3) print(q2.get()) # 出队操作 print(q2.get()) print(q2.get()) # ==== 执行结果 ==== """ 3 2 1 """ # ==== 优先级队列 ==== q3 = queue.PriorityQueue(maxsize=5) q2.put([10,"优先级为10"]) # 入队操作 q2.put([20,"优先级为20"]) q2.put([30,"优先级为30"]) print(q2.get()) # 出队操作,如果想取出具体元素,加个 索引[1] 即可 print(q2.get()) print(q2.get()) # ==== 执行结果 ==== """ [30, '优先级为30'] [20, '优先级为20'] [10, '优先级为10'] """