10.4.4 Queue

10.4.4 Queue

Queue模块实现多生产者、多消费者队列。Thread提供的Queue类实现多线程编程所需要的锁原语,是线程安全的,不需要额外的同步机制,尤其适合需要在多个线程之间进行信息交换的场合。Queue类对象的get()和put()方法都支持一个超时参数timeout,调用该方法时如果超时会抛出异常。

当信息必须在多个线程之间安全地交换时,Queue在线程编程中特别有用,是多线程之间安全共享数据的最佳技术之一。

put()方法用于插入数据,格式:

put()方法可以将item插入队列中,如果block为True(默认),且timeout为正值,则会阻塞timeout指定的时间,直到该队列有剩余的空间。如果超时,就会抛出Queue.Full异常,如果block为False,但是该Queue已经满了,就会立即抛出Queue.Full异常。

get()方法用于读取数据,格式:

get()方法从队列中读取并删除一个元素。如果block为True(默认),并且timeout为正值,那么在等待时间内没有读取到任何元素,会抛出Queue.Empty异常;如果block为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,如果队列为空,则立即抛出Queue.Empty异常。

Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue、LIFO(后入先出)队列LifoQueue和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。

Queue模块中除了put()和get()方法之外,还有如下常用方法。

·Queue.qsize():返回队列的大小。

·Queue.empty():如果队列为空,返回True,反之返回False。

·Queue.full():如果队列满了,返回True,反之返回False,Queue.full与maxsize大小对应。

·Queue.get_nowait():相当于Queue.get(False)。

·Queue.put_nowait(item):相当于Queue.put(item,False)。

·Queue.task_done():在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。

·Queue.join():实际上意味着等到队列为空,再执行别的操作。

例如,用Queue进行线程同步,以实现窗口卖票时的排除现象,实现代码如下:

运行结果: