使用一个例子探析:生产者消费者在多线程之间的通信的使用

简介: 使用一个例子探析:生产者消费者在多线程之间的通信的使用

项目需求


有三个模块函数我们有如下特性:


  1. fun1模块函数启动的时候后续的两个模块才跟着启动;


  1. fun2模块函数会生成3个返回值;


  1. fun3模块函数将使用fun2模块函数产生的值处理。


  现需要将如上的三个函数模块进行如下操作,fun2与fun3是处于Ture循环中,fun2一直负责生产数据而fun3则是一直进行消费数据




需求分析


  对于上述的三个函数模块我们能很好的构造出来,构造函数文件名为Fun:


import random
def fun1():
    print("启动")
def fun2():
    x = random.random()
    a = x + 1
    b = x + 2
    c = x + 3
    return a, b, c
def fun3(a, b, c):
    y = a + b + c
    print(y)
复制代码



  这三个函数模块我们单独构建好了,剩下的就是如何构建Tur循环进行生产者消费者模式的搭建了,通过上面的Fun.py中我们能够看出fun1是作为启动函数,可以建立在生产者消费者的前面。剩下的就是如何将函数fun2和fun3使用生产者消费者搭建起来。


  明显可以看出:fun2是作为生产者(运行一次可以得到a,b,c三个值),fun3是作为消费者(消费fun2生产的三个值进行处理),这里可以我们选择队列进行完成函数值的传递。

from queue import Queue
queue = Queue()  # 实例化队列
复制代码





参考代码


from threading import Thread
import time
from queue import Queue
import Fun
class Producer(Thread):
    def __init__(self,queue):
        super(Producer, self).__init__()
        self.queue = queue
    def run(self):
        while True:
            x1, x2, x3 = Fun.fun2()
            self.queue.put(x1)
            self.queue.put(x2)
            self.queue.put(x3)
            time.sleep(1)
class Consumer(Thread):
    def __init__(self,queue):
        super(Consumer, self).__init__()
        self.queue = queue
    def run(self):
        while True:
            try:
                Fun.fun3(self.queue.get_nowait(), self.queue.get_nowait(), self.queue.get_nowait())
                print("队列长度", self.queue.qsize())
            except Exception:
                print('消费者出错')
            # time.sleep(random.randrange(2))
            time.sleep(1)
if __name__ == '__main__':
    print("---主线程开始---")
    Fun.fun1()
    queue = Queue()  # 实例化队列
    producer = Producer(queue)  # 实例化线程 Producer,并传入队列作为参数
    consumer = Consumer(queue)  # 实例化线程 Consumer,并传入队列作为参数
    producer.start()  # 启动线程 Producer
    consumer.start()  # 启动线程 Consumer
    producer.join()  # 等待线程 Producer 结束
    consumer.join()  # 等待线程 Consumer 结束
    print("---主线程结束---")



相关文章
|
30天前
|
Java 调度
[Java]线程生命周期与线程通信
本文详细探讨了线程生命周期与线程通信。文章首先分析了线程的五个基本状态及其转换过程,结合JDK1.8版本的特点进行了深入讲解。接着,通过多个实例介绍了线程通信的几种实现方式,包括使用`volatile`关键字、`Object`类的`wait()`和`notify()`方法、`CountDownLatch`、`ReentrantLock`结合`Condition`以及`LockSupport`等工具。全文旨在帮助读者理解线程管理的核心概念和技术细节。
38 1
[Java]线程生命周期与线程通信
|
16天前
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
31 3
|
1月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
19 1
|
1月前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
38 1
|
1月前
|
Java
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件成立时被唤醒,从而有效解决数据一致性和同步问题。本文通过对比其他通信机制,展示了 `wait()` 和 `notify()` 的优势,并通过生产者-消费者模型的示例代码,详细说明了其使用方法和重要性。
26 1
|
1月前
|
Java
|
1月前
多线程通信和同步的方式有哪些?
【10月更文挑战第6天】
104 0
|
1月前
|
消息中间件 NoSQL 关系型数据库
【多线程-从零开始-捌】阻塞队列,消费者生产者模型
【多线程-从零开始-捌】阻塞队列,消费者生产者模型
25 0
|
3月前
|
算法 Java
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
该博客文章综合介绍了Java并发编程的基础知识,包括线程与进程的区别、并发与并行的概念、线程的生命周期状态、`sleep`与`wait`方法的差异、`Lock`接口及其实现类与`synchronized`关键字的对比,以及生产者和消费者问题的解决方案和使用`Condition`对象替代`synchronized`关键字的方法。
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
|
3月前
|
消息中间件 设计模式 安全
多线程魔法:揭秘一个JVM中如何同时运行多个消费者
【8月更文挑战第22天】在Java虚拟机(JVM)中探索多消费者模式,此模式解耦生产与消费过程,提升系统性能。通过`ExecutorService`和`BlockingQueue`构建含2个生产者及4个消费者的系统,实现实时消息处理。多消费者模式虽增强处理能力,但也引入线程安全与资源竞争等挑战,需谨慎设计以确保高效稳定运行。
94 2
下一篇
无影云桌面