• 多线程中的生产者消费者模型


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

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

    什么是生产者消费者模式

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

    下面我以一个例子来说明这个问题:

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # author:Erik Chan
    # datetime:2019/1/10 12:50
    # software: PyCharm

    import threading,time
    import queue

    #定义一个最大长度为10的队列
    q= queue.Queue(maxsize=5)

    #生产者
    def Producer(name):
    count = 1
    while True:
    q.put("面包%s"%count)
    print("生产了面包", count)
    count += 1
    time.sleep(0.2)


    #消费者
    def Consumer(name):
    while True:
    print("[%s] 吃了[%s] ..." % (name, q.get()))
    time.sleep(1)


    #生产者对象Jack
    p = threading.Thread(target=Producer,args=("Jack",))
    #消费者对象Mary
    p2 = threading.Thread(target=Consumer,args=("Mary",))
    #消费者对象Alice
    p3 = threading.Thread(target=Consumer,args=("Alice",))

    p.start()
    p2.start()
    p3.start()

    以上代码中,p,p2,p3线程并发启动运行,并且p线程生产面包的速度更快,我们可以看到p一遍生产面包,p2,p3边吃面包的情况。

    运行截图:

  • 相关阅读:
    在Unix上使用管道压缩exp导出文件
    自制CPU的黑暗历程一
    Error C1189: #error: Please use the /MD switch for _AFXDLL builds
    Redis乐观锁解决高并发抢红包的问题
    PHP分页类
    汇编基础——使用nasm和bochs学习汇编
    数据同步工具DBsync
    完成端口的一些教程
    sdf
    (转)C#(WIN FORM)两个窗体间LISTVIEW值的修改
  • 原文地址:https://www.cnblogs.com/erikchanBolg/p/10249409.html
Copyright © 2020-2023  润新知