Python并发编程-queue
Python并发编程-queue
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.Queue
1 # !/usr/bin/env python 2 # _*_conding:utf-8_*_ 3 # @author :yinzhengjie 4 # blog:http://www.cnblogs.com/yinzhengjie 5 6 from queue import Queue 7 8 """ 9 Queue是先进先出(First-in-First-out)队列,常用方法如下: 10 queue.Queue(maxsize=0): 11 创建FIFO队列,返回Queue对象 12 maxsize表示队列大小,小于等于0则队列长度没有限制 13 14 Queue.get(block=True,timeout=None): 15 从队列中移除元素并返回这个元素 16 block为阻塞,timeout为超时 17 如果block为True,是阻塞,timeout为None就是一直阻塞 18 如果block为True单timeout有值,就阻塞到一定描述抛出Empty异常 19 block为False,是非阻塞,timeout将被忽略,要么成功返回一个元素,要么抛出empty异常 20 21 Queue.get_nowait(): 22 等价于get(False),也就是说要么成功返回一个元素,要么抛出empty异常 23 但是queue的这种阻塞效果,需要多线程来演示 24 25 Queue.put(item,block=True,time=None): 26 把一个元素加入到队列中去 27 block=True,timeout=None,表示如果当前队列已经满了,则一直阻塞直至有空位存放元素。 28 block=True,timeout=5,表示如果当前队列已经满了,则阻塞五秒依旧没有空位存放元素就抛出Full异常 29 block=Flase,timeout失效,立即返回,能塞进去就塞进去,不能就抛出Full异常。 30 31 Queue.put_nowait(item): 32 等价于Queue.put(item,False),也就是能塞进去就塞,不能就抛出Full异常 33 """ 34 35 q = Queue(3) # 设置队列大小为3 36 q.put("hdfs") 37 q.put("mapreduce") 38 print(q.qsize(), q.full()) 39 q.put("yarn") 40 print(q.qsize(), q.full()) 41 # q.put("hbase") #这里会阻塞,因为上面已经网队列中放慢3个了,再放是没法放进队列啦,直到有人消费数据才能有多余的空间存入 42 43 print(q.get()) 44 print(q.qsize(), q.empty()) 45 print(q.get()) 46 print(q.qsize(), q.empty()) 47 print(q.get()) 48 # print(q.get()) #这里也会阻塞,因为已经从队列中取出三个了,再去是取不出来啦,直到有人放入数据才能取到数据 49 # print(q.get(timeout=3)) #阻塞,但超时3秒还拿不到数据就会抛出Empty异常。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
2 False 3 True hdfs 2 False mapreduce 1 False yarn
二.LifoQueue
1 #!/usr/bin/env python 2 #_*_conding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie 5 6 from queue import LifoQueue 7 """ 8 LifoQueue是后进先出队列,这个类继承自Queue,使用方式同Queue。 9 """ 10 11 q = LifoQueue(3) #设置队列大小为3 12 q.put("hdfs") 13 q.put("mapreduce") 14 print(q.qsize(),q.full()) 15 q.put("yarn") 16 print(q.qsize(),q.full()) 17 # q.put("hive") #这里会阻塞,因为上面已经网队列中放慢3个了,再放是没法放进队列啦,直到有人消费数据才能有多余的空间存入 18 19 print(q.get()) 20 print(q.qsize(),q.empty()) 21 print(q.get()) 22 print(q.qsize(),q.empty()) 23 print(q.get()) 24 # print(q.get()) #这里也会阻塞,因为已经从队列中取出三个了,再去是取不出来啦,直到有人放入数据才能取到数据 25 # print(q.get(timeout=3)) #阻塞,但超时3秒还拿不到数据就会抛出Empty异常。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
2 False 3 True yarn 2 False mapreduce 1 False hdfs
三.PriorityQueue
1 # !/usr/bin/env python 2 # _*_conding:utf-8_*_ 3 # @author :yinzhengjie 4 # blog:http://www.cnblogs.com/yinzhengjie 5 6 from queue import PriorityQueue 7 import random 8 from string import ascii_lowercase 9 10 """ 11 PriorityQueue是优先队列,这个类继承自Queue类,并重写了入队,出队的方法。 12 它里面是堆,用列表实现的堆,构建的是小顶堆。 13 元素可以存储任意值,但是优先队列内部是直接进行元素大小比较的,不同类型比较可能抛出异常 14 入队时,将元素加入到列表末尾,然后进行小顶堆调整 15 出队时,将索引0即堆顶处最小值弹出,然后将最后一个元素放到堆顶,重新堆调整。 16 """ 17 18 q = PriorityQueue() 19 20 gender = ["boy","girl"] #我们模拟一下男生和女士,不管传入的字符串随机字符串是如何,最终取出来的数据应该是男士优先的 21 22 for i in range(10): 23 q.put("{} : {}".format(random.choice(gender),random.choice(ascii_lowercase))) 24 25 while not q.empty(): 26 print(q.get_nowait())
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
boy : m
boy : m
boy : s
boy : w
girl : a
girl : a
girl : d
girl : h
girl : m
girl : y
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。
欢迎交流学习技术交流,个人微信: "JasonYin2020"(添加时请备注来源及意图备注)
作者: 尹正杰, 博客: https://www.cnblogs.com/yinzhengjie/p/11874224.html