使用生产者消费者模型实现RD-QA解耦

在前面有讲到使用yield实现单线程下并发的例子,详细可参考如下链接https://blog.csdn.net/qq_44801116/article/details/97698438,今天主要亲测使用queue实现真正的多线程之间的并发。
一、知识点简介
(1)生产者消费者模型是通过一个容器解决生产者和消费者的强耦合问题。在并发编程中主要用于解决并发的问题。
(2)queue
queue可以完成将程序由强耦合变为弱耦合,也可以提高工作效率。
主要有两个方法:
put(item,block=True,timeout=None):将数据放到队列中,默认放不进了会堵塞,超时时间默认未设置。
get(block=True,timeout=None):读取队列中数据,默认读取不到了会堵塞,超时时间默认未设置。
在定义queue时工作有三种模式:
先进先出:q = queue.Queue()
后进先出:q = queue.LifoQueue()
优先出:q = queue.PriorityQueue()
(3)生产者消费者模型与queue的结合
生产者queue.put放数据——》queue《——消费者queue.get读取数据

二、实际代码
import threading,time,queue

def RD(name):
“”“”
该部分为生产者部分-开发不断完成项目
“”"
count = 1
while True:
q.put(“Project %s”%count)
print(“[%s]开发完成了Project %s”%(name,count))
count +=1
time.sleep(1)

def QA(name):
“”"
该部分为消费者部分-对开发完的项目进行测试
:return:
“”"
while True:
print(“[%s]负责[%s]测试”%(name,q.get()))

q = queue.Queue(maxsize=5)
p =threading.Thread(target=RD,args = (“Mr Song”,))
c1 =threading.Thread(target=QA,args = (“Mr Liu”,))
c2 =threading.Thread(target=QA,args = (“Miss Ye”,))
p.start()
c1.start()
c2.start()
三、三种测试场景
代码主要用常见的RD开发项目(生产者为宋先生),QA测试项目(消费者为刘先生和叶女士)
(1)未增加延时
在这里插入图片描述
显然宋先生不断开发新的项目,刘先生和叶女士分别很默契的进行项目的测试。
(1)生产者速度快于消费者
消费者中增加sleep时间,运行结果如下:
在这里插入图片描述
由图可知,宋先生的开发速度不受测试速度的影响,宋先生可以踏实不断开发,刘先生和叶女士可以也有节奏的进行测试。
(2)消费者快于生产者
生产者增加sleep时间,运行结果如下:
在这里插入图片描述
由图可知,测试同学可按照开发速度进行工作。
四、实例–不同的人干相同的活(类似同一个团队,队员轮流接受任务进行执行)

"""
日期:20230801
功能:实现多人同时进行某一件事
说明:
结合自己使用场景进行组合指令,修改完毕后,需修改总运行时间(单位:s):total_time
使用时,需修改人员列表:Personnel_list
执行次数,修改参数s
"""
import threading,datetime,queue
import requests
import time
import random


def get_ecu(total_time,run_times):
    """
    功能:获取干活人员
    """
    count=1
    for i in range(run_times):
        print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        print("当前开始第"+str(i+1)+"循环")
        for j in range(len(Personnel_list)):
            if  j <len(Personnel_list):
                q.put(Personnel_list[j])
                count += 1
                time.sleep(total_time//len(Personnel_list))
    print("______________🎉game over😄________________")
    print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))


def all_command():
    while True:
        person = q.get()
        print(person+"来干活了")
        time.sleep(20)


if __name__ =="__main__":
    #运行的总时间:单位s
    total_time = 20
    #s:执行次数
    s = 2
    Personnel_list = ["张先生","李先生","王先生"]
    q = queue.Queue(maxsize=len(Personnel_list) + 5)
    p = threading.Thread(target=get_ecu, args=(total_time, s))
    p.start()
    for i in range(len(Personnel_list)):
        c_name = "c"+ str(i)
        c_name = threading.Thread(target=all_command)
        c_name.start()

执行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值