项目需求
有三个模块函数我们有如下特性:
- fun1模块函数启动的时候后续的两个模块才跟着启动;
- fun2模块函数会生成3个返回值;
- 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("---主线程结束---")