线程编程中,正确的线程同步是保证数据正确性所不可缺少的。我们经常会采用生产者/消费者关系的两个线程来处理一个共享缓冲区的数据。利用Python的List和互斥锁可以模拟出一个共享的缓冲区。不过更简单的方法是利用Python的Queue模块。
Python Queue模块有三种队列:
1. FIFO(先进先出)队列,构造函数为Queue.Queue(maxsize)
2. LIFO(先进后出)队列,构造函数为Queue.LifoQueue(maxsize)
3. 优先级队列 PriorityQueue(),构造函数为Queue.PriorityQueue(maxsize)
这三种队列的构造函数都接受一个可选的参数maxsize,即队列的最大长度,如果不指定则默认为0,表示队列无限长。
new_queue = Queue.Queue(maxsize = 10)
上面创建了一个先进先出的队列,其最大长度为10。
要向队列中添加一项,可使用队列的put()方法:
new_queue.put(item)
调用队列对象的put() 方法在队尾插入一个项目。put()有两个参数,第一个参数item为必需的,为插入的内容;第二个参数block可选,默认为1 。如果队列当前为空且block为1 ,put()方法就使调用线程暂停,直到空出一个数据单元。如果block 为0,put 方法将引发Full异常。
队列的get()方法可以从队头删除并返回一个项目。
myqueue.get()
get()方法可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。
Queue.qsize()
qsize()方法可以返回队列的大小。
如果要知道队列是不是为空,或者是否已满,可以分别使用以下方法:
Queue.empty() 如果队列为空,返回True,否则返回False
Queue.full() 如果队列已满,返回True,否则返回False
还有一些常用的方法:
Queue.task_done() 在完成一项工作之后,Queue.task_done() 函数向任务已经完成的队列发送一个信号
Queue.join() 等到队列为空,再继续执行别的操作。