python中的queue模块提供了同步的、线程安全的队列类,包括FIFO(先进先出)的Queue类和LIFO(后进先出,栈结构)LifoQueue类和优先队列PriorityQueue类,它们都实现了锁原语(可以理解为原子操作,要么不做,要么就全部做完),解决了python多线程编程中的线程不安全。
队列与列表的区别
队列中数据只有一份,取出就没有了,列表数据取出只是复制了一份
1、初始化一个队列
Queue(maxsize=0) 或者
LifoQueue(maxsize=0) 或者
PriorityQueue(maxsize=0)
maxsize是个整数,指明了队列中能存放的数据个数上限。一旦达到上限,插入会导致阻塞,直到队列中有数据被取出。如果maxsize<=0,队列大小没有限制
2、qsize():获取队列当前数据的数量
3、empty():判断队列是否为空
4、full():判断队列是否满
5、get(block=True, timeout=None):从队列中取出一个数据
block:是否阻塞调用,
阻塞调用如果队列为空会一直阻塞直到队列中放入数据
非阻塞调用时队列已空抛出Empty异常
如果设置了timeout超时时间并且发生超时抛出Empty异常
get_nowait()为非阻塞取出数据,等同于get(block=False)
6、put(item, block=True, timeout=None):讲一个数据放入到队列中
阻塞调用如果队列已满会一直阻塞直到队列中取出数据
非阻塞调用时队列已满抛出Full异常
如果设置了timeout超时时间并且发生超时抛出Full异常
put_nowait(item)为非阻塞取出数据,等同于put(item,block=False)
7、queue.clear():清空队列
8、task_done():意味着从队列中取出的一个任务已经完成。每一次调用get()得到一个任务,接下来的task_done()调用告诉队列该任务已经处理完毕。如果当前一个join()正在阻塞,它将在队列中的所有任务都处理完时恢复执行(即每一个由put()调用入队的任务都有一个对应的task_done()调用)。
9、join():阻塞调用线程,直到队列中的所有任务被处理掉。只要有数据被加入队列,未完成的任务数就会增加。当调用task_done(),未完成的任务数就会减少。当未完成的任务数降到0,join()解除阻塞。
优先队列:优先队列不同于先进先出或后进先出,它是出的规则和进入的顺序无关,只和数据的优先级有关,优先级小的数据先出,在put()的时候item需要传入一个二元元祖,第一个元素是一个正整数,表示优先级,第二个元素是放入的数据,优先级的数字可以重复,同等优先级的数据遵循先进先出的原则。
作者:qingheluo