队列Queue
提供同步的、线程安全的队列类, 可以用于线程之间的线程通信。
queue模块实现了多生产者、多消费者队列。这特别适用于消息必须安全地在多线程交换的线程编程。
该模块实现了三种类型的队列,它们的区别是任务取回的顺序。在FIFO队列中,先添加任务的先取回。在LIFO队列中,最后添加的任务先取回(该操作类似于堆栈)。在优先级队列中,条目将保持排序(使用heapq模块)并且最小值的任务第一个返回。
Queue(maxsize=0)
先进后出队列
常用方法
-
Queue.qsize()
返回队列的大小 -
Queue.empty()
如果队列为空,返回True,反之False -
Queue.full()
是否满,如果满了返回True,反之False,Queue.full
与maxsize
大小对应 -
Queue.get([block[, timeout]])
获取队列数据,没有数据会进行阻塞,timeout等待时间 -
Queue.get_nowait()
相当于Queue.get(False)
,非阻塞方法 -
Queue.put(item)
写入队列,timeout等待时间 -
Queue.task_done()
在完成一项工作之后,Queue.task_done()
函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。 -
Queue.join()
阻塞调用,直至队列数据为空,才进行下一步执行
Queue队列中的join()和task_done()是配合使用的,。tase_done()的作用:只有消费者把队列所有的数据处理完毕,queue.join()才会停止阻塞
import queue
q = queue.Queue()
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
print(q.get())
1
2
3
import queue
q = queue.Queue(maxsize=5)
q.put(1)
q.put(2)
q.put(3)
q.put(4)
q.put(5)
print(q.full())
True
LifoQueue
后进先出队列 -栈
import queue
q = queue.LifoQueue()
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
print(q.get())
3
2
1
PriorityQueue
优先级队列
数据可以设置优先级,同优先级的按照 ASCII 排序
import queue
q = queue.PriorityQueue()
q.put((2, '2'))
q.put((1, 'a'))
q.put((3, '3'))
q.put((1, '1'))
print(q.get())
print(q.get())
print(q.get())
print(q.get())
(1, '1')
(1, 'a')
(2, '2')
(3, '3')
线程通信
from threading import Thread
import queue
q = queue.Queue()
def worker():
while True:
item = q.get()
print(f'Working on {item}')
print(f'Finished {item}')
q.task_done()
# turn-on the worker thread
Thread(target=worker, daemon=True).start() # daemon=True 守护进程,主进程结束,子进程也结束
# send thirty task requests to the worker
for item in range(5):
q.put(item)
print('All task requests sent >>>')
# block until all tasks are done
q.join() # 阻塞,直到队列处理结束
print('All work completed')
All task requests sent >>>
Working on 0
Finished 0
Working on 1
Finished 1
Working on 2
Finished 2
Working on 3
Finished 3
Working on 4
Finished 4
All work completed
总结
from queue import Queue,LifoQueue,PriorityQueue
#先进先出队列
q=Queue(maxsize=5)
#后进先出队列
lq=LifoQueue(maxsize=5)
#优先级队列
pq=PriorityQueue(maxsize=5)
for i in range(5):
q.put(i)
lq.put(i)
pq.put(i)
print ("先进先出队列{};是否为空{}多大{};是否满{}".format(q.queue,q.empty(),q.qsize(),q.full()))
print ("先进后出队列{};是否为空{}多大{};是否满{}".format(lq.queue,lq.empty(),lq.qsize(),lq.full()))
print ("优先级队列{};是否为空{}多大{};是否满{}".format(pq.queue,pq.empty(),pq.qsize(),pq.full()))
print (q.get(),lq.get(),pq.get())
print ("先进先出队列{};是否为空{}多大{};是否满{}".format(q.queue,q.empty(),q.qsize(),q.full()))
print ("先进后出队列{};是否为空{}多大{};是否满{}".format(lq.queue,lq.empty(),lq.qsize(),lq.full()))
print ("优先级队列{};是否为空{}多大{};是否满{}".format(pq.queue,pq.empty(),pq.qsize(),pq.full()))
# 先进先出队列deque([0, 1, 2, 3, 4]);是否为空False多大5;是否满True
# 先进先出队列[0, 1, 2, 3, 4];是否为空False多大5;是否满True
# 先进先出队列[0, 1, 2, 3, 4];是否为空False多大5;是否满True
# 0 4 0
# 先进先出队列deque([1, 2, 3, 4]);是否为空False多大4;是否满False
# 先进先出队列[0, 1, 2, 3];是否为空False多大4;是否满False
# 先进先出队列[1, 3, 2, 4];是否为空False多大4;是否满False
标签:queue,get,python,put,Queue,队列,print
From: https://www.cnblogs.com/tian777/p/17382824.html