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

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

项目需求


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


  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("---主线程结束---")



相关文章
|
8天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
8天前
|
Python
如何在Python中实现线程之间的同步和通信?
【2月更文挑战第17天】【2月更文挑战第51篇】如何在Python中实现线程之间的同步和通信?
|
19小时前
|
Java 调度
【JAVA学习之路 | 提高篇】线程的通信
【JAVA学习之路 | 提高篇】线程的通信
|
4天前
|
Java
Java一分钟之-并发编程:线程间通信(Phaser, CyclicBarrier, Semaphore)
【5月更文挑战第19天】Java并发编程中,Phaser、CyclicBarrier和Semaphore是三种强大的同步工具。Phaser用于阶段性任务协调,支持动态注册;CyclicBarrier允许线程同步执行,适合循环任务;Semaphore控制资源访问线程数,常用于限流和资源池管理。了解其使用场景、常见问题及避免策略,结合代码示例,能有效提升并发程序效率。注意异常处理和资源管理,以防止并发问题。
28 2
|
8天前
|
存储 NoSQL Redis
深入浅出Redis(二):Redis单线程模型与通信流程
深入浅出Redis(二):Redis单线程模型与通信流程
|
8天前
|
监控 安全 Java
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
|
8天前
线程间的通信
线程间的通信
14 0
|
8天前
|
Java Linux
【linux线程(三)】生产者消费者模型详解(多版本)
【linux线程(三)】生产者消费者模型详解(多版本)
|
8天前
|
安全 Java 编译器
【JavaEE多线程】线程安全、锁机制及线程间通信
【JavaEE多线程】线程安全、锁机制及线程间通信
33 1
|
8天前
|
Java
Java线程通信的精髓:解析通知等待机制的工作原理
Java线程通信的精髓:解析通知等待机制的工作原理
28 3
Java线程通信的精髓:解析通知等待机制的工作原理