网站横条广告,百度推广需要手机网站,做公司网站的服务费入什么费用,织梦配置手机网站queue 模块即队列#xff0c;特别适合处理信息在多个线程间安全交换的多线程程序中。下面我们对 queue 模块进行一个详细的使用介绍。
1 queue 模块定义的类和异常
queue 模块定义了以下四种不同类型的队列#xff0c;它们之间的区别在于数据入队列之后出队列的顺序不同。 …queue 模块即队列特别适合处理信息在多个线程间安全交换的多线程程序中。下面我们对 queue 模块进行一个详细的使用介绍。
1 queue 模块定义的类和异常
queue 模块定义了以下四种不同类型的队列它们之间的区别在于数据入队列之后出队列的顺序不同。
1.1 queue.Queue(maxsize0)
先进先出(First In First Out: FIFO)队列最早进入队列的数据拥有出队列的优先权就像看电影入场时排队一样排在队伍前头的优先进入电影院。
入参 maxsize 是一个整数用于设置队列的最大长度。一旦队列达到上限插入数据将会被阻塞直到有数据出队列之后才可以继续插入。如果 maxsize 设置为小于或等于零则队列的长度没有限制。
示例如下
import queue
q queue.Queue() # 创建 Queue 队列
for i in range(3):q.put(i) # 在队列中依次插入0、1、2元素
for i in range(3):print(q.get()) # 依次从队列中取出插入的元素数据元素输出顺序为0、1、21.2 queue.LifoQueue(maxsize0)
后进先出(Last In First Out: LIFO)队列最后进入队列的数据拥有出队列的优先权就像栈一样。
入参 maxsize 与先进先出队列的定义一样。
示例如下
import queue
q queue.LifoQueue() # 创建 LifoQueue 队列
for i in range(3):q.put(i) # 在队列中依次插入0、1、2元素
for i in range(3):print(q.get()) # 依次从队列中取出插入的元素数据元素输出顺序为2、1、01.3 PriorityQueue(maxsize0)
优先级队列比较队列中每个数据的大小值最小的数据拥有出队列的优先权。数据一般以元组的形式插入典型形式为(priority_number, data)。如果队列中的数据没有可比性那么数据将被包装在一个类中忽略数据值仅仅比较优先级数字。
入参 maxsize 与先进先出队列的定义一样。
示例如下
import queue
q queue.PriorityQueue() # 创建 PriorityQueue 队列
data1 (1, python)
data2 (2, -)
data3 (3, 100)
style (data2, data3, data1)
for i in style:q.put(i) # 在队列中依次插入元素 data2、data3、data1
for i in range(3):print(q.get()) # 依次从队列中取出插入的元素数据元素输出顺序为 data1、data2、data31.4 queue.SimpleQueue
先进先出类型的简单队列没有大小限制。由于它是简单队列相比于 Queue 队列会缺少一些高级功能下面第2-3小节将会介绍。
示例如下
import queue
q queue.SimpleQueue() # 创建 SimpleQueue 队列
for i in range(3):q.put(i) # 在队列中依次插入0、1、2元素
for i in range(3):print(q.get()) # 依次从队列中取出插入的元素数据元素输出顺序为0、1、21.5 queue.Empty 异常
当队列中没有数据元素时取出队列中的数据会引发 queue.Empty 异常主要是不正当使用 get() 和 get_nowait() 引起的。
示例如下
import queue
try:q queue.Queue(3) # 设置队列上限为3q.put(python) # 在队列中插入字符串 pythonq.put(-) # 在队列中插入字符串 -q.put(100) # 在队列中插入字符串 100for i in range(4): # 从队列中取数据取出次数为4次引发 queue.Empty 异常print(q.get(blockFalse))
except queue.Empty:print(queue.Empty)1.6 queue.Full 异常
当队列数据元素容量达到上限时继续往队列中放入数据会引发 queue.Empty 异常主要是不正当使用 put() 和 put_nowait() 引起的。
示例如下
import queue
try:q queue.Queue(3) # 设置队列上限为3q.put(python) # 在队列中插入字符串 pythonq.put(-) # 在队列中插入字符串 -q.put(100) # 在队列中插入字符串 100q.put(stay hungry, stay foolish, blockFalse) # 队列已满继续往队列中放入数据引发 queue.Full 异常
except queue.Full:print(queue.Full)2 Queue、LifoQueue、PriorityQueue 和 SimpleQueue 对象的基本使用方法
Queue、LifoQueue、PriorityQueue 和 SimpleQueue 四种队列定义的对象均提供了以下函数使用方法下面以 Queue 队列为例进行介绍。
2.1 Queue.qsize()
返回队列中数据元素的个数。
示例如下
import queue
q queue.Queue()
q.put(python-100) # 在队列中插入元素 python-100
print(q.qsize()) # 输出队列中元素个数为12.2 Queue.empty()
如果队列为空返回 True否则返回 False。
示例如下
import queue
q queue.Queue()
print(q.empty()) # 对列为空返回 True
q.put(python-100) # 在队列中插入元素 python-100
print(q.empty()) # 对列不为空返回 False2.3 Queue.full()
如果队列中元素个数达到上限返回 True否则返回 False。
示例如下
import queue
q queue.Queue(3) # 定义一个长度为3的队列
print(q.full()) # 元素个数未达到上限返回 False
q.put(python) # 在队列中插入字符串 python
q.put(-) # 在队列中插入字符串 -
q.put(100) # 在队列中插入字符串 100
print(q.full()) # 元素个数达到上限返回 True2.4 Queue.put(item, blockTrue, timeoutNone)
item放入队列中的数据元素。 block当队列中元素个数达到上限继续往里放数据时如果 blockFalse直接引发 queue.Full 异常如果 blockTrue且 timeoutNone则一直等待直到有数据出队列后可以放入数据如果 blockTrue且 timeoutNN 为某一正整数时则等待 N 秒如果队列中还没有位置放入数据就引发 queue.Full 异常。 timeout设置超时时间。 示例如下
import queue
try:q queue.Queue(2) # 设置队列上限为2q.put(python) # 在队列中插入字符串 pythonq.put(-) # 在队列中插入字符串 -q.put(100, block True, timeout 5) # 队列已满继续在队列中插入字符串 100等待5秒后会引发 queue.Full 异常
except queue.Full:print(queue.Full)2.5 Queue.put_nowait(item)
相当于 Queue.put(item, blockFalse)当队列中元素个数达到上限继续往里放数据时直接引发 queue.Full 异常。
import queue
try:q queue.Queue(2) # 设置队列上限为2q.put_nowait(python) # 在队列中插入字符串 pythonq.put_nowait(-) # 在队列中插入字符串 -q.put_nowait(100) # 队列已满继续在队列中插入字符串 100直接引发 queue.Full 异常
except queue.Full:print(queue.Full)2.6 Queue.get(blockTrue, timeoutNone)
从队列中取出数据并返回该数据内容。
block当队列中没有数据元素继续取数据时如果 blockFalse直接引发 queue.Empty 异常如果 blockTrue且 timeoutNone则一直等待直到有数据入队列后可以取出数据如果 blockTrue且 timeoutNN 为某一正整数时则等待 N 秒如果队列中还没有数据放入的话就引发 queue.Empty 异常。 timeout设置超时时间。 示例如下
import queue
try:q queue.Queue()q.get(block True, timeout 5) # 队列为空往队列中取数据时等待5秒后会引发 queue.Empty 异常
except queue.Empty:print(queue.Empty)2.7 Queue.get_nowait()
相当于 Queue.get(blockFalse)block当队列中没有数据元素继续取数据时直接引发 queue.Empty 异常。
示例如下
import queue
try:q queue.Queue()q.get_nowait() # 队列为空往队列中取数据时直接引发 queue.Empty 异常
except queue.Empty:print(queue.Empty)3 Queue、LifoQueue 和 PriorityQueue 对象的高级使用方法
SimpleQueue 是 Python 3.7 版本中新加入的特性与 Queue、LifoQueue 和 PriorityQueue 三种队列相比缺少了 task_done 和 join 的高级使用方法所以才会取名叫 Simple 了下面介绍一下 task_done 和 join 的使用方法。
task_done表示队列内的数据元素已经被取出即每个 get 用于获取一个数据元素 后续调用 task_done 告诉队列该数据的处理已经完成。如果被调用的次数多于放入队列中的元素个数将引发 ValueError 异常。 join一直阻塞直到队列中的所有数据元素都被取出和执行只要有元素添加到 queue 中就会增加。当未完成任务的计数等于0join 就不会阻塞。 示例如下
import queue
q queue.Queue()
q.put(python)
q.put(-)
q.put(100)
for i in range(3):print(q.get())q.task_done() # 如果不执行 task_donejoin 会一直处于阻塞状态等待 task_done 告知它数据的处理已经完成
q.join()下面是一个经典示例生产者和消费者线程分别生产数据和消费数据先生产后消费。采用 task_done 和 join 确保处理信息在多个线程间安全交换生产者生产的数据能够全部被消费者消费掉。
from queue import Queue
import random
import threading
import time#生产者线程
class Producer(threading.Thread):def __init__(self, t_name, queue):threading.Thread.__init__(self, namet_name)self.dataqueuedef run(self):for i in range(5):print (%s: %s is producing %d to the queue! %(time.ctime(), self.getName(), i))self.data.put(i) # 将生产的数据放入队列time.sleep(random.randrange(10)/5)print (%s: %s finished! %(time.ctime(), self.getName()))#消费者线程
class Consumer(threading.Thread):def __init__(self, t_name, queue):threading.Thread.__init__(self, namet_name)self.dataqueuedef run(self):for i in range(5):val self.data.get() # 拿出已经生产好的数据print (%s: %s is consuming. %d in the queue is consumed! %(time.ctime(), self.getName(), val))time.sleep(random.randrange(5))self.data.task_done() # 告诉队列有关这个数据的任务已经处理完成print (%s: %s finished! %(time.ctime(), self.getName()))#主线程
def main():queue Queue()producer Producer(Pro., queue)consumer Consumer(Con., queue)producer.start()consumer.start()queue.join() # 阻塞直到生产者生产的数据全都被消费掉producer.join() # 等待生产者线程结束consumer.join() # 等待消费者线程结束print (All threads terminate!)if __name__ __main__:main()4 总结
本节给大家介绍了 Python 的 queue 模块为 Python 工程师对该模块的使用提供了支撑让大家对 queue 模块的相关概念和使用有一个初步的了解。