• 队列


    队列

    队列类似于一条管道,元素先进先出,进put(arg),取get()
    有一点需要注意的是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态.
    

    队列分类

    队列有很多中,但都依赖模块queue
    
    队列方式	特点
    queue.Queue	先进先出队列
    queue.LifoQueue	后进先出队列
    queue.PriorityQueue	优先级队列
    queue.deque	双线队列
    

    队列的方法

    方法	用法说明
    put	放数据,Queue.put()默认有block=True和timeout两个参数。当block=True时,写入是阻塞式的,阻塞时间由timeout确定。当队列q被(其他线程)写满后,这段代码就会阻塞,直至其他线程取走数据。Queue.put()方法加上 block=False 的参数,即可解决这个隐蔽的问题。但要注意,非阻塞方式写队列,当队列满时会抛出 exception Queue.Full 的异常
    get	取数据(默认阻塞),Queue.get([block[, timeout]])获取队列,timeout等待时间
    empty	如果队列为空,返回True,反之False
    qsize	显示队列中真实存在的元素长度
    maxsize	最大支持的队列长度,使用时无括号
    join	实际上意味着等到队列为空,再执行别的操作
    task_done	在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
    full	如果队列满了,返回True,反之False
    

    示例一

    # 导入队列
    from queue import Queue
    
    # 最多接收3个数据
    q = Queue(3)
    
    # put 向队列中添加数据
    q.put(1)
    q.put(2)
    q.put(3)
    
    # 获取当前队列长度
    print(q.qsize())
    
    # 取出最前面的一个数据 1 , 还剩两个
    print(q.get())
    
    # 再加入数据
    q.put(4)
    
    #超过三个了.如果没有timeout参数会处于阻塞状态,卡在那边.若设置2秒,2秒后会raise 一个 FULL的报错
    q.put(5, timeout=2))
    
    # 当然,也可以直接给个 block=False,强制设置为不阻塞(默认为会阻塞的),一旦超出队列长度,立即抛出异常
    q.put(6, block=False)
    
    # 同样的,当取值(get)的次数大于队列的长度的时候就会产生阻塞,设置超时时间意为最多等待x秒,队列中再没有数据,就抛出异常.
      也可以使用block参数,跟上面一样
    

    示例二:join & task_done

    empty: 检查队列是否为空,为空返回True,不为空返回False
    full : 判断队列是否已经满了
    
    join & task_done :
    #举例
    from queue import Queue
    q = queue.Queue(2)
    q.put('a')
    q.put('b')
    # 程序会一直卡在下面这一行,只要队列中还有值,程序就不会退出
    q.join()
    -------------------------------------------------------------
    q = queue.Queue(2)
    q.put('a')
    q.put('b')
    
    q.get() 
    q.get()
    # 插入两个元素之后再取出两个元素,执行后发现,程序还是卡在下面的那个join代码
    q.join()
    -------------------------------------------------------------
    q = queue.Queue(2)
    q.put('a')
    q.put('b')
    
    q.get()
    # get取完队列中的一个值后,使用task_done方法告诉队列,我已经取出了一个值并处理完毕,下同
    q.task_done() 
    q.get()
    #在每次get取值之后,还需要在跟队列声明一下,我已经取出了数据并处理完毕,这样执行到join代码的时候才不会被卡住
    q.task_done()
    q.join()
    希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华
  • 相关阅读:
    mitmproxy抓包工具
    java基础|int和Integer的区别
    Vue|退出功能
    Vue|分页处理
    apt-get本地软件源搭建
    rqt_plot报错
    创建ROS 工作空间时出现:程序“catkin_init_workspace”尚未安装,程序“catkin_make”尚未安装。
    ubuntu16.04安装ROS
    debian及Ubuntu各版本下载地址获取
    解决sudo rosdep init和rosdep update的错误
  • 原文地址:https://www.cnblogs.com/daviddd/p/12633804.html
Copyright © 2020-2023  润新知