队列

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())

你可能感兴趣的:(队列)