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异常。
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异常。
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())
boy : m
boy : m
boy : s
boy : w
girl : a
girl : a
girl : d
girl : h
girl : m
girl : y
以上代码执行结果戳这里
原文地址:https://www.cnblogs.com/yinzhengjie/p/11874224.html