• python queue和生产者和消费者模型


     

    queue队列

    当必须安全地在多个线程之间交换信息时,队列在线程编程中特别有用。

    class queue.Queue(maxsize=0) #先入先出
    class queue.LifoQueue(maxsize=0) #last in fisrt out 
    class queue.PriorityQueue(maxsize=0) #存储数据时可设置优先级的队列

    没有数据会一直等。服务器端就会卡住。

    有数据就取没有数据就抛出异常。

    block=true 阻塞 取不到数据就会阻塞IO

    timeout =1 阻塞时间1S 等待一秒 没有新消息就抛出错误

    maxsize= 3 队列只能放3个元素 超过了以后会卡住。

    LifoQueue() 后入先出

    q = queue.LifoQueue()
    q.put(1)
    q.put(3)
    q.put(4)
    
    print(q.get()) #4
    print(q.get()) #3
    print(q.get()) #1
    

     PriorityQueue() 有优先级的队列

    import queue
    
    q = queue.PriorityQueue()
    q.put((-1,'jim'))
    q.put((20,'lilei'))
    q.put((3,'lily'))
    q.put((2,'lucy'))
    
    print(q.get())
    print(q.get())
    print(q.get())
    print(q.get())
    #############
    (-1, 'jim')
    (2, 'lucy')
    (3, 'lily')
    (20, 'lilei')
    

     生产者和消费者模型

    在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。

    为什么要使用生产者和消费者模式

    在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。

    什么是生产者消费者模式

    生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

    import queue
    import threading,time
    
    q = queue.Queue(maxsize=10)
    def Producer(name):
        count =1
        while True:
            q.put("包子 %s" % count)
            print("做了包子",count)
            count +=1
            time.sleep(0.5)
    def Consumer(name):
        while True :
            print("[%s] 取到[%s] 并且吃了它..." %(name,q.get()))
            time.sleep(1)
    
    p = threading.Thread(target=Producer,args=("Lily",))
    c = threading.Thread(target=Consumer,args=("Lilei",))
    c1 = threading.Thread(target=Consumer,args=("Ahi",))
    
    p.start()
    c.start()
    c1.start()
    

     运行结果

    做了包子 1
    [Lilei] 取到[包子 1] 并且吃了它...
    做了包子 2
    [Ahi] 取到[包子 2] 并且吃了它...
    [Lilei] 取到[包子 3] 并且吃了它...
    做了包子 3
    做了包子 4
    [Ahi] 取到[包子 4] 并且吃了它...
    做了包子 5
    [Lilei] 取到[包子 5] 并且吃了它...
    做了包子 6
    [Ahi] 取到[包子 6] 并且吃了它...
    做了包子 7
    [Lilei] 取到[包子 7] 并且吃了它...
    做了包子 8
    [Ahi] 取到[包子 8] 并且吃了它...
    做了包子 9
    [Lilei] 取到[包子 9] 并且吃了它...
    做了包子 10
    [Ahi] 取到[包子 10] 并且吃了它...
    
  • 相关阅读:
    .net core 3.1 添加区域 area
    JMeter 网站并发测试工具使用教程
    .net core 3.1 使用ado.net
    .net core 3.1 mvc 调试的时 更改cshtml页面 刷新浏览器不更新
    .net core 3.1 autofac(webapi / mvc 通过)
    .net core3.1 rest api 无法接收 vue 中 axios 请求
    .net core 3.1 web api 允许跨域
    mysql 中文匹配
    mysql 分组排序
    mysql json处理
  • 原文地址:https://www.cnblogs.com/qing-chen/p/7684812.html
Copyright © 2020-2023  润新知