python中Queue是消息队列,提供线程间通信机制,python3中重名为为queue
Queue模块中的类:
Queue(maxsize=0):创建一个FIFO队列,若给定最大值,队列没有空间时阻塞,否则是无限队列
LifoQueue(maxsize=0):创建一个栈,maxsize含义同上
PriorityQueue(maxsize=0):创建一个优先队列,maxsize含义同上
Queue模块异常:
Empty:对空队列调用get*()方法时抛出异常
Full:对满队列调用put*()方法时抛出异常
Queue对象方法:
qsize():返回队列大小,是近似值(返回时可能队列大小被修改了)
empty():判断队列是否为空
full():判断队列是否为满
put(item, block=True, timeout=None):将item加入队列,可选阻塞和阻塞时间
put_nowait(item):即put(item, False)
get(block=True, timeout=None):从队列中获取元素,可选阻塞和阻塞时间
get_nowait():即get(False)
task_done():用于表示队列中某个元素已经执行完成,会被join()调用
join():队列中所有元素执行完毕并调用task_done()信号之前,保持阻塞
一个使用Queue通信的例子:
# -*- coding: UTF-8 -*-
#!/usr/bin/env python
import thread
from time import sleep
import threading
from random import randrange
from atexit import register
from Queue import Queue
def writeQ(queue):
for i in range(100):
tmp = queue.get(True)
queue.put(tmp + 1, True)
def readQ(queue):
for i in range(100):
tmp = queue.get(True)
queue.put(tmp + 1, True)
def main():
q = Queue(32)
q.put(0, True)
threading.Thread(target=writeQ, args = (q,)).start()
threading.Thread(target=readQ, args = (q,)).start()
sleep(2)
print q.get(True)
if __name__ == '__main__':
main()
可以得出结论,Queue模块内部有同步机制,因此调用Queue的应用模块不需要担心并发的问题