Python的Queue模块中提供了同步的、线程安全的队列类,包括:FIFO(先入先出)队列QueueLIFO(后入先出)队列LifoQueue,优先级队列PriorityQueue,这些队列都实现了锁,能够在多线程中直接使用。可以使用队列来实现线程间的同步。初始化Queue()对象时(例如:q=Queue()),若括号中没有指定最大可接收的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限。
一:队列的方法
Queue.qsize():返回当前队列包含的消息数量;
Queue.empty() 如果队列为空,返回True,反之False
Queue.full() 如果队列满了,返回True,反之False
Queue.get()获取队列,timeout等待时间
# 如果block表示是否等待,如果timeout表示是否等待,
get(self, block=True, timeout=None)
Queue.put(item) 写入队列
# 如果block表示是否等待,如果timeout表示是否等待,
put(self, item, block=True, timeout=None)
from queue import Queue,LifoQueue,PriorityQueue
# 创建一个队列对,3是maxsize参数,控制队列长度
q = Queue(3)
# 往队列中添加数据的方法:put
# 如果队列已满,则会进入堵塞状态(等待)
# 参数block:如果队列已满是否等待;timeout:等待的超时时间
q.put("111")
q.put("222")
q.put("333")
# q.put("444")
# 获取对列中数据的方法:get
# 如果队列为空,则会进入堵塞状态(等待)
# 参数block:如果队列为空是否等待;timeout:等待的超时时间
print("获取对列里的数据:",q.get())
q.put("444")
print("获取对列里的数据:",q.get())
print("获取对列里的数据:",q.get())
print("----end-----")
# full:判断队列是否已满
print("队列是否已满:",q.full())
# empty:判断队列是否为空
print("队列是否为空:",q.empty())
# 获取队列中的数据量
print("获取队列里的数据量:",q.qsize())
image.png
Queue.task_done() 在完成一项工作之后,使用Queue.task_done()方法可以向队列发送一个信号,表示该任务执行完毕
Queue.join() 实际上意味着等到队列中所有的任务(数据)执行完毕之后,再往下,否则一直等待
注意点:join()是判断的依据,不单单指的是队列中没有数据,数据get出去之后,要使用task_done()向队列发送一个信号,表示该任务执行(数据使用)完毕
import time,random
from queue import Queue
from threading import Thread
q = Queue()
for i in range(10):
q.put("数据{}".format(i))
def work(data):
"""
线程执行的公众函数
:param data:
:return:
"""
for i in range(1):
time.sleep(random.randint(1,3))
print("数据data:{}处理完毕".format(data))
# 给队列发送一个信号,告诉对象这条数据处理完毕(执行完了一个任务)
q.task_done()
def main():
"""使用队列等待的方法"""
for i in range(10):
data = q.get()
t1 = Thread(target=work,args=(data,))
t1.start()
# 等待队列中所有的任务执行完毕(数据处理完毕)
q.join()
print("等待线程中所有的数据处理完毕再往下执行---")
main()
二、后入先出队列LifoQueue
from queue import Queue,LifoQueue,PriorityQueue
# ---------后入先出队列-----------------------
# 创建一个后入先出队列,3是maxsize参数,控制队列长度
q = LifoQueue(3)
# 往队列中添加数据的方法:put
q.put("111")
q.put("222")
q.put("333")
# 获取对列中数据的方法:get
print("获取对列里的数据:",q.get())
q.put("444")
print("获取对列里的数据:",q.get())
print("获取对列里的数据:",q.get())
image.png
三、优先级队列:PriorityQueue
from queue import Queue,LifoQueue,PriorityQueue
q = PriorityQueue(3)
# 往队列中添加数据的方法:put
# tuple第一个参数为优先级,数值越小先出
q.put((99,"111"))
q.put((6,"222"))
q.put((28,"333"))
# 获取对列中数据的方法:get
print("获取对列里的数据:",q.get())
print("获取对列里的数据:",q.get())
print("获取对列里的数据:",q.get())