• ~~并发编程(十四):Queue~~


    进击のpython

    *****

    并发编程——Queue


    进程其实就提过这个Queue的问题,我们为什么在进程使用Queue?

    是因为当时我们想要对共享数据进行修改,同时也希望它能够自动的给我加个锁

    基于上面的需求Queue就应运而生,扛起了这杆大旗

    那反观线程这里,数据是共享的,那为什么还要使用Queue呢?

    其实线程用Queue也是看上了他能够自己加锁的这个能力,防止自己加锁,出现死锁

    单拿出来不是为了划水,而是因为Queue还有一些其他的方法没有介绍到

    所以准备重新的再仔细地最后介绍一遍


    队列

    队列就像是商场里面的自动扶梯,先上扶梯的,也是第一个下去的

    所以队列遵循着“先进先出”原则,即:FIFO

    import queue
    
    q = queue.Queue()
    q.put('first')
    q.put('second')
    q.put('third')
    
    print(q.get())
    print(q.get())
    print(q.get())
    
    

    输出结果:

    first
    second
    third
    

    其中如果q = queue.Queue()中括号内填有数字,代表着管道的容积可以最多容纳的单元

    如果是这样q = queue.Queue(3),就说明管道中最多容纳三个单位

    当我put四次,由于没有从管道中取值,就会引发阻塞

    相对应的,如果我get了四次,由于值都已经取完 ,所以也会发生阻塞

    其实阻塞是因为Queue中有个默认参数block=True

    他的意思就是是否发生阻塞,如果改成False,当‘放多了’或者‘拿多了’,就会报错

    里面还有一个默认参数timeout=None是多长时间改变block的状态

    q.get(block = True, timeout = 1)
    

    比如此时这个get是第四次get,那就是,现在是阻塞状态,如果1s之内没有值让我get我就报错

    堆栈

    queue.LifoQueue 堆栈遵循“后进先出”

    import queue
    
    q = queue.LifoQueue(3)
    q.put('first')
    q.put('second')
    q.put('third')
    
    print(q.get())
    print(q.get())
    print(q.get())
    
    

    执行结果如下:

    third
    second
    first
    

    有一句话说得好,队列是“吃了拉”,堆栈是“吃了吐”

    优先级队列

    queue.PriorityQueue 根据优先级决定

    import queue
    
    
    q=queue.PriorityQueue()
    
    q.put((20,'a'))
    q.put((10,'b'))
    q.put((30,'c'))
    
    print(q.get())
    print(q.get())
    print(q.get())
    
    

    put放进去一个元组,元组的第一个元素是优先级(通常是数字,也可以是非数字之间的比较)

    数字越小优先级越高!

    执行结果如下:

    (10, 'b')
    (20, 'a')
    (30, 'c')
    

    *****
    *****
  • 相关阅读:
    Android ANR 知多少
    电源管理
    功耗分析
    手机功耗测试
    Battery Historian
    Android 电量优化
    Android手机功耗
    功耗 Log 抓取要求规范
    Android 手机无法进入系统解决方案
    定屏死机问题操作指南
  • 原文地址:https://www.cnblogs.com/jevious/p/11413476.html
Copyright © 2020-2023  润新知