zoukankan      html  css  js  c++  java
  • 多线程中的生产者消费者模型

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

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

    什么是生产者消费者模式

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

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

    #!/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边吃面包的情况。

    运行截图:

  • 相关阅读:
    Linux中断管理 (2)软中断和tasklet
    Linux中断管理 (1)Linux中断管理机制
    Linux中断管理
    Linux内核访问用户空间文件:get_fs()/set_fs()的使用
    Linux进程管理 (1)进程的诞生
    Linux进程管理专题
    Linux内存管理 (23)一个内存Oops解析
    Linux内存管理 (22)内存检测技术(slub_debug/kmemleak/kasan)
    Linux内存管理 (21)OOM
    Linux内存管理 (20)最新更新和展望
  • 原文地址:https://www.cnblogs.com/erikchanBolg/p/10249409.html
Copyright © 2011-2022 走看看