zoukankan      html  css  js  c++  java
  • Python队列

    Python中有队列的库---queue,自带的,不需要我们另外下载,直接导入用即可

    学习队列我们可以直接从官方的文档中直接学习,这里贴一下:https://docs.python.org/zh-cn/3.7/library/queue.html#simplequeue-objects  这是中文的文档

    还可以通过源码直接学习,看自己怎么习惯怎么来吧

    首先通过官方文档我们可以知道Python中的队列的简介:

    queue 模块实现多生产者,多消费者队列。当信息必须安全的在多线程之间交换时,它在线程编程中是特别有用的。此模块中的 Queue 类实现了所有锁定需求的语义。它依赖于Python支持的线程可用性

    从这里我们可以明白队列是适用于生产者,消费者,同时队列实现了所有锁的需求语义,这句话什么意思呢?告诉我们如果使用多线程和队列的同时,就完全不用考虑锁的问题了。

    其次我们可以从官方文档中知道队列有三种,先入先出队列,先入后出队列,优先级队列

    解释下这三种队列的区别:

    先入先出:从字面意思可以理解先进入队列的会先被拿出来,也就是先进入队列的任务会先被拿出来执行

    先入后出:从字面意思可以理解为先进入队列的会在最后被拿出来,也就是先进入队列的任务会在最后被拿出来执行

    优先级队列:每一个进入队列的任务会有一个优先级标签,在把任务取出来的时候会按照这个优先级作为考量,将其取出,会按照优先级越低先取出来执行

    下面介绍下队列中最重要的了,建议直接从源码中进行学习

    1、创建队列

    创建一个先入先出的队列

    q = queue.Queue()

    查看源码我们知道Queue类中有一个maxsize参数,默认为0,我们可以不传,也就是默认为0了,但同时底层实现了如果为0的话就表示这个队列无限大。所以如果你要限制队列的大小,那就必须得传一个数字了,而且必须大于0,因为小于等于0都会表示是一个无限大的队列

     创建一个先入后出的队列

    q = queue.LifoQueue()

    创建一个优先级队列

    q = queue.PriorityQueue()

    值得注意的是,PriorityQueue和LifoQueue都是继承于Queue的,所以里面的方法的用法没有区别

    2、添加任务到队列,使用put方法

    用法:

    q = queue.Queue(2)   # 创建一个队列,容量为2
    q.put(1)   # 正常插入
    q.put(2)   # 正常插入
    q.put(3)   # 会引发异常,一直阻塞,直到队列有空闲位置

    同时put_nowait方法也是添加任务到队列,与put方法的区别为:put方法如果满了不会直接报错,会一直阻塞,而put_nowait会直接报错

    3、获取队列中的任务,使用get方法

    用法

    q = queue.Queue(2)   
    q.put(1)   
    print(q.get())  

    同时,get_nowait方法也会从队列中取值,与get方法的区别在于:如果队列为空,使用get则会阻塞,使用get_nowait则会直接报错

    4、获取队列中的任务数量,使用qsize方法

    用法

    q = queue.Queue()   # 创建一个队列
    q.put(1)   
    q.put(2)  
    print(q.qsize())  # 获取队列的大小

    5、获取队列是否已经满了,使用full方法

    用法

    q = queue.Queue(2)   # 创建一个队列
    q.put(1)
    q.put(2)
    print(q.full())  # 获取队列是否已经被装满,满了则返回True,没有满则返回False

    6、获取队列是否为空,使用empty方法

    用法

    q = queue.Queue(2)   # 创建一个队列
    q.put(1)
    q.put(2)
    print(q.empty())  # 获取队列是否为空,为空则返回True,不为空则返回False

    7、队列任务被执行完成,使用task_done方法

    用法

    q = queue.Queue(2)   # 创建一个队列
    q.put(1)
    q.get() q.task_done()

    所以我们在调用get方法后就要调用task_done方法告诉队列这个任务已经被完成了,已经空闲了一个队列位置了,但是注意的是,如果调用的次数多余队列中的任务数则会引发ValueError异常

    8、队列中任务执行完毕后执行后续的逻辑,使用join方法

    用法

    q = queue.Queue(2)   # 创建一个队列
    q.put(1)
    q.task_done()
    q.join()
    print("cccc")

    以上介绍的就是队列中的常用方法,get了吗?

  • 相关阅读:
    数据结构与算法系列——排序(6)_树形选择排序
    数据结构与算法系列——排序(7)_堆排序
    数据结构与算法系列——排序(5)_简单选择排序
    数据结构与算法系列——排序(4)_Shell希尔排序
    数据结构与算法系列——排序(3)_折半插入排序
    数据结构与算法系列——排序(2)_直接插入排序
    数据结构与算法系列——排序(1)_概述
    Java高级开发_性能优化的细节
    图形推理
    美团点评面试20190515
  • 原文地址:https://www.cnblogs.com/Pycainiao/p/14777721.html
Copyright © 2011-2022 走看看