python3 线程间通信
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通信的例子:
code
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()