多线程利器-队列(queue)

#队列有3中模式,先进先出,先进后出,优先级
1:先进先出
import queue
q = queue.Queue()     #默认是先进先出
q.put(12)
q.put('jack')
q.put({'name':'ok'})
while True:
data = q.get()
print(data)


q = queue.Queue(maxsize = 2)     #队列数据只能存三个数据
q.put(12)
q.put('jack')
q.put([1,2,3])
q.put({'name':'ok'}) #存满三个数据超出后;就卡死在这,除非有另外一个线程取前面的数据

while True:
data = q.get()
print(data)





q = queue.Queue()
q.put(12)
q.put('jack')
q.put([1,2,3])
q.put({'name':'ok'},False) #False 队列满了提示报错

while True:
data = q.get(block=False) #False 队列取完提示报错
print(data)

2:先进后出(LifoQueue)
q = queue.LifoQueue()
q.put(12)
q.put('jack')
q.put([1,2,3])

while True:
data = q.get()
print(data)





3:优先级(PriorityQueue);谁小谁现出
q = queue.PriorityQueue()

q.put([3,12]) #列表第一个元素代表优先级
q.put([2,'jack'])
q.put([5,[1,2,3]])

while True:
data = q.get()
print(data)

其他一些操作:
此包中的常用方法(q = Queue.Queue()):
q.qsize() 返回队列的大小
q.empty() 如果队列为空,返回True,反之False
q.full() 如果队列满了,返回True,反之False
q.full 与 maxsize 大小对应
q.get([block[, timeout]]) 获取队列,timeout等待时间
q.get_nowait() 相当q.get(False)
非阻塞 q.put(item) 写入队列,timeout等待时间
q.put_nowait(item) 相当q.put(item, False)
q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
q.join() 实际上意味着等到队列为空,再执行别的操作

q = queue.PriorityQueue(maxsize=3)
q.put([3,12])
q.put([2,'jack'])
q.put([5,[1,2,3]])

print(q.qsize()) #队列有多少值
print(q.empty()) #是否为空,False
print(q.full()) #是否已经存满,如果是True(上面写了最大3个)
q.get_nowait(22) 等价于 q.get(block=False) #22随便放的数就可以了
q.put_nowait(22) 等价于 q.put(block=False)
 
q.task_done() 和 q.join()示例
import time,random
import queue,threading

q = queue.Queue()

def Producer(name):
count = 0
while count <10:
print("making........")
time.sleep(2)
q.put(count)
print('Producer %s has produced %s baozi..' %(name, count))
count +=1
q.task_done() #这里面发送一个完成的信息给队里q (q.join() )
print("ok......")
def Consumer(name):
count = 0
while count <10:
q.join() #这里面接收到队里q有完成的信息后,就接着运行下面代码,不然会一直在这卡死状态,等待上面生成完包子的信息(同理如果这是q.task_done(),就会产生吃完包子的消息,上面q.join()接收消息后接着生产)
data = q.get()
print('33[32;1mConsumer %s has eat %s baozi...33[0m' %(name, data))
count +=1

p1 = threading.Thread(target=Producer, args=('A',))
c1 = threading.Thread(target=Consumer, args=('B',))
c2 = threading.Thread(target=Consumer, args=('C',))
# c3 = threading.Thread(target=Consumer, args=('D',))
p1.start()
c1.start()
c2.start()
# c3.start()




 
原文地址:https://www.cnblogs.com/ajaxa/p/9134423.html