• 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
    以上代码执行结果戳这里
  • 相关阅读:
    Objective-C面向对象-对象和类
    eImage(仅两行代码实现输出从数据库中查询到的二进制字段)标签
    yii第三方插件snoopy配置
    iOS应用崩溃日志分析 iOS应用崩溃日志揭秘
    斯坦福《机器学习》Lesson6感想———1、函数间隔和几何间隔
    openstack 中国联盟公开课參会总结
    【翻译自mos文章】多租户中的service管理
    谷歌浏览器訪问不了啦,oh shit!
    从程序员转向淘宝店主的探索
    Python爬取韩寒所有新浪博客
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/11874224.html
Copyright © 2020-2023  润新知