Queue线程安全队列
一、Queue线程安全队列概述
Python内置的线程安全的模块叫queue
- Queue是线程安全的队列,在使用时无需加锁,可以在多线程中直接使用
- 队列也是实现线程间同步的方式
- FIFO(先进先出)队列Queue
- LIFO(后进先出)LifoQueue
二、Queue队列的常用函数
函数 | 描述 |
---|---|
qsize() | 返回队列的大小 |
empty() | 判断队列是否为空 |
full() | 判断队列是否满了 |
get() | 从队列中取最先插入的数据 |
put() | 将一个数据放到队列中 |
#创建一个队列,最多可以存放5个数据
q = Queue(5)
for i in range(4):
q.put(i)
print('队列中实际数据的多少:',q.qsize())
#取出队列当中的数据
for _ in range(5): #_只记录循环次数,不做变量使用
try: #队列中只有4个元素,而当前要取5次,会造成阻塞,程序在取完所有数据后不会停止,直到再放入一个数据完成第5次取数
#所以在此处使用try...except...语句,使取完所有数后程序即结束
print('取出的元素:',q.get(block=False)) #通过设置block=False参数,使程序取完队列当中的数据即退出
except:
print('数据已经取完,队列目前为空')
break
if q.full():
print('队列已满')
else:
print('队列当前数据的个数为:',q.qsize(),'队列未满')
print('-----------------------------------------------')
q2 = Queue(5)
for i in range(6): #队列当中最多存放5个数据,而此处放入6个数据,程序会等待其中一个元素被取出后,放入第六个元素才会结束,程序又进入拥塞状态
try:
q2.put(i,block=False)
except:
print('队列已满')
break
队列中实际数据的多少: 4
取出的元素: 0
取出的元素: 1
取出的元素: 2
取出的元素: 3
数据已经取完,队列目前为空
队列当前数据的个数为: 0 队列未满
-----------------------------------------------
队列已满
Process finished with exit code 0
三、Queue线程安全队列的使用
from queue import Queue
import random
import time
import threading
def add_value(q): #存数据
while True:
q.put(random.randint(100,1000))
time.sleep(1)
def get_value(q): #取数据
while True:
print('取出了元素:{0}'.format(q.get()))
def start():
q = Queue(10)
t1 = threading.Thread(target=add_value,args=(q,))
t2 = threading.Thread(target=get_value,args=(q,))
t1.start()
t2.start()
if __name__ == '__main__':
start()