「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战」
队列是一种派生出来的列表,与一般列表相比,它具有先进先出(FIFO)的数据结构,即 最早进入队列的元素,最早被提取出来处理。队列只能从队尾插入元素,在队首删除元素。 就像在银行排队等待办事,最早被交到号的人第一个办理业务,其他人根据号码排队,直到 轮到他们为止。
python3中使用queue模块来实现队列的功能。一般会使用queue.Queue。
import queue #引入queue模块
q1 = queue.Queue(maxsize = 10) #创建queue对象,队列长度为10。通过maxsize来制定队列长度。
q2 = queue.Queue()#创建queue对象,队列长度为无限。不指定maxsize,队列长度为无限。
将一个值放入队列中,插入位置为队尾。
q.put(10) #此时放入的值为10,还可以放入其他类型值,例如字符串,列表,元组等。
将一个值从队列中取出,删除位置为队首
q.get() ##此时取出的值为10.
值得一提的是,由于队列的特性,队列通常用于多线程的通信。因为Queue每次使用get()获取数据以后,都会从内部 删除获取的数据,以保证下次不会获取到重复的数据,所以队列是线程安全的。 而列表或元组虽然可以作为线程的存储结构,但它们都是线程不安全的,需要自己加锁来保证线程安全。
q.qsize() #返回队列大小
q.full() #若队列为满,返回True,否则返回False。注意,队列若含有元素,但没有达到maxsize,仍会返回False。
q.empty() #若队列为空,返回True,否则返回False
q.task_done() #在完成工作后,函数会向队列发送信号
q.join() #等到队列为空,再执行其他操作。
另外还有一个常用属性,如果想知道队列中具体的元素,可以使用: q.queue;未完成的个数,只要有元素添加到queue中就会增加。未完成的个数,只要消费者线程调用task_done()表明其被取走,其调用结束。当未完成任务的计数等于0,join()就会不阻塞
Queue模块解决了生产者、消费者问题,在多线程编程中进行线程通信的时候尤其有用,Queue类封装了加锁解锁的过程。