简介
Python标准库提供的queue模块,是多生产者,多消费者的队列,特别适用于在多线程中的线程之间安全地交换数据。
queue模块支持三种类型的队列。分别为先进先出队列(FIFO)、后进先出队列(LIFO)、优先级队列(入值被排序,最小值先出)。
这三种类型的队列通过锁机制,临时锁住竞争的线程。
在queue模块中,还实现了一个简单的FIFO队列,即SimpleQueue。
实现的类
queue模块定义了以下的类:
class queue.Queue(maxsize=0)
#构建FIFO队列,参数maxsize是一个整数值,设置改队列可承载的最大元素个数
#当队列满时,insert操作将阻塞,直到队列有空余
#当参数maxsize小于或者等于0,则队列空间为无限大
class queue.LifoQueue(maxsize=0)
#构建LIFO队列,参数maxsize是一个整数值,设置改队列可承载的最大元素个数
#当队列满时,insert操作将阻塞,直到队列有空余
#当参数maxsize小于或者等于0,则队列空间为无限大
class queue.PriorityQueue(maxsize=0)
#构建优先级队列,参数maxsize是一个整数值,设置改队列可承载的最大元素个数
#当队列满时,insert操作将阻塞,直到队列有空余
#当参数maxsize小于或者等于0,则队列空间为无限大
#值最小的元素将最先返回
class queue.SimpleQueue
#构建一个队列空间无限大的FIFO队列
实现的异常
queue模块定义了以下的异常:
exception queue.Empty
#当对空的队列对象执行非阻塞的get操作,引起该异常
exception queue.Full
#当对满的队列对象执行非阻塞的put操作,引起该异常
方法
队列对象提供了以下的方法:
Queue.qsize()
#返回队列元素个数,注意,当方法返回值大于0,并不保证紧接的get操作不会阻塞,当方法返回值小于maxsize,并不保证紧接的put操作不会阻塞
Queue.empty()
#如果队列为空,返回True,否则返回False
#注意,如果方法返回True,并不保证紧接的put操作不会阻塞,同样,如果方法返回False,并不保证紧接的get操作不会阻塞
Queue.full()
#如果队列为满,返回True,否则返回False
#注意,如果方法返回True,并不保证紧接的get操作不会阻塞,同样,如果方法返回False,并不保证紧接的put操作不会阻塞
Queue.put(item, block=True, timeout=None)
#方法将元素item传入队列中
#如果block为True,且timeout为None,方法将阻塞,直到队列有空余空间
#如果block为True,且timeout为大于0值,则方法将至多阻塞timeout秒,如果队列依然没有空间,则引起exception queue.Full异常
#如果block为False,则参数timeout被忽略,队列如果没有空间,则立马引起exception queue.Full异常
Queue.get(block=True, timeout=None)
#方法从队列删除元素,并通过方法返回值返回该元素
#如果block为True,且timeout为None,方法将阻塞,直到队列有可返回的元素
#如果block为True,且timeout为大于0值,则方法将至多阻塞timeout秒,如果队列依然没有可返回的元素,则引起exception queue.Empty异常
#如果block为False,则参数timeout被忽略,队列如果没有可返回的元素,则立马引起exception queue.Empty异常
Queue.task_done()
#方法表示针对队列元素的任务已经完成,该方法被消费者线程调用。
#如果此时join()方法正在阻塞,则当队列中所有的元素都被处理过(表示对于队列中每个元素,task_done()方法都被调用),join()方法解阻塞
Queue.join()
#阻塞,直到队列中所有的元素都被处理过(task_done())