队列queue知识补充

为什么要有队列?
1.多个线程之间维持一个数据先后的秩序
2.线程模块的队列是线程之间数据安全的

常用方法

import queue

q = queue.Queue(5)  # 设置队列的长度
q.put(1)
print('1 over')
q.put(2)
print('2 over')
q.put(3)
print('3 over')
q.put(4)
print('4 over')
q.put(5)
print('5 over')

print(q.get())
q.put(6)    # 队列满了如何还没取,就会阻塞
print('6 over')
q.put(7)
print('7 over')
print(q.get())

 

q.get() # 在队列为空时会阻塞
q.put() # 在队列满时会阻塞
get_nowait() # 在队列为空的时候也不阻塞,这时候会抛异常queue.Empty
put_nowait(1) # 在队列满的时候也不阻塞,这时候会抛异常queue.Full
当线程或进程中用到不够准确
q.qsize() # 当前队列中有多少个值
q.empty() # 当前队列是否为空
q.full() # 当前队列是否为满
import queue
# 先进先出的队列 :维护用户的请求顺序
q = queue.Queue(3)
try:
    print(q.get_nowait())  # 在队列为空的时候也不阻塞,这时候会抛异常queue.Empty
except queue.Empty:
    print('队列为空')
    pass
import queue
q = queue.Queue(3)
q.put(1)
q.put(1)
q.put(1)
try:
    q.put_nowait(1)   # 在队列满的时候也不阻塞,这时候会抛异常queue.Full
except queue.Full:
    print('队列已满')
    pass

 

栈

import queue
# 栈先入后出
q = queue.LifoQueue()
q.put('a')
q.put('b')
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
print(q.get())

 

优先级队列

按元组的第一个元素的ASCII码来优先取,当第一个元素相同时按第二个元素的ASCII码去

# 优先级队列
q = queue.PriorityQueue()
q.put((2, 'abc'))
q.put((1, 'bbb'))
q.put((1, 'ccc'))
q.put((3, 'ccc'))
q.put((2, 'ccc'))
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())

 

posted @ 2019-01-28 22:14  平平无奇小辣鸡  阅读(415)  评论(0)    收藏  举报