首页 > 其他分享 >多线程|生产者消费模型

多线程|生产者消费模型

时间:2023-09-04 18:55:17浏览次数:40  
标签:int 生产者 模型 阻塞 队列 tail 服务器 多线程 head

在正式介绍生产者消费者模型之前,我们先来认识一下阻塞队列。

阻塞队列是特殊的队列,是在先进先出的基础上加了一些特殊的功能:

1)如果队列为空,线程要执行出队操作时,就会进入阻塞,阻塞直到另一个线程往队列里添加元素;

2)如果队列满了,线程要进行入队操作时,就会进入阻塞,直到有另一个线程从队列里取走元素。

生产者消费者模型

生产者消费者模型是什么?

生产者消费者之间不直接通讯,而是通过阻塞队列来进行通讯。生产者产出数据放入阻塞队列中,消费者需要数据则从阻塞队列中获取。生产者消费者模型有两大好处:

1)降低耦合

举个开发中典型的场景:服务器之间的相互调用,

 从游戏客户端向A服务器发送充值请求,A服务器接到充值请求之后,将计算金额的任务转发给B服务器,B服务器处理好之后将计算好的金额返回给A服务器,A服务器经处理后将充值结果返回给客户端程序。上述过程中,A服务器和B服务器之间的交互可以视为是A调用了B,此时,A和B之间的耦合是很高的,也就是关联性非常高,如果B服务器挂了,很容易引起A服务器的bug。使用生产者消费者就可以很好的解决上述问题。

 在A服务器和B服务器之间引入阻塞队列,A将请求放入阻塞队列1中,B服务器从阻塞队列1中拿去元素,处理好之后放入阻塞队列2中,A服务器从阻塞队列2中获取元素。此时A与B之间的耦合就降低了,B服务器如果挂了,不会引起A服务器的bug,A服务器只需要将元素放入阻塞队列1中,如果队列满了就进入阻塞,同样的,如果要从队列2中获取元素,如果队列为空,也阻塞等待。经过这样的处理之后,任何一个服务器挂了都不会引起另一个服务器的bug。

2)“削峰填谷”

生产者消费者模型里的阻塞队列可以认为是一个缓冲区,当一个服务器收到大量的请求,处理大量的请求服务器可能会扛不住,此时,可以将这些请求放入一个阻塞队列中,让“消费者”慢慢来处理这些请求。

代码实现阻塞队列

我们基于链表来实现一个阻塞队列,主要实现入队列和出队列功能。

 我们使用tail来标记入队列时的下标记录,放入新的数据,tail++;当有数据出队列时,head执行“++”操作,那么在[head,tail)区间都是有数据的。这里我们引入size来记录个数,size等于队列长度则为满,否则不为满。

代码如下:

class MyBlockingQueue{
    //设置变量
    public int[] item = new int[1000];
    public int head = 0;
    public int tail = 0;
    public int size = 0;
    //入队列
    public void put(int value) throws InterruptedException{
        //判断队列是否为满,为满进入阻塞,直到队列有元素被取走
        synchronized (this){
            if(size == item.length){
                //进入阻塞,这里使用wait
                this.wait();
            }
            item[tail] = value;
            tail++;
            size++;
            //数组长度有限,如何利用有限的长度放入无限的元素,这里设置当tail的值大于等于数组长度的时候,将tail置为0.
            if(tail >= item.length){
                tail = 0;
            }
            //唤醒take中的wait
            this.notify();
        }
    }

    //出队列
    public int take() throws InterruptedException{
        int res = 0;
        synchronized (this){
            //判断是否为空,为空则阻塞,这里同样也使用wait
            if(size == 0){
                this.wait();
            }
            res = item[head];
            head++;
            size--;
            //与tail一样,head在大于等于数组长度的时候要置为0.
            if(head >= item.length){
                head = 0;
            }
            //唤醒put中的wait
            this.notify();
        }
        return res;
    }

标签:int,生产者,模型,阻塞,队列,tail,服务器,多线程,head
From: https://www.cnblogs.com/xbyss/p/17675231.html

相关文章

  • 理论基础-BASE理论和分布式事务模型
       ......
  • Ziya-LLaMA-13B 模型在GPU 上部署
    Ziya-LLaMA-13B模型在GPU上部署Ziya-LLaMA-13B是IDEA-CCNL基于LLaMa的130亿参数的大规模预训练模型,具备翻译,编程,文本分类,信息抽取,摘要,文案生成,常识问答和数学计算等能力。目前姜子牙通用大模型已完成大规模预训练、多任务有监督微调和人类反馈学习三阶段的训练过程。1.部署准......
  • java多线程爬取笔趣阁所有小说
    可以选择下载的数量,全部下载下来够呛,首先没那么大的盘新版本:https://wws.lanzous.com/iAEMoghsgeb密码:7vjzjar包:https://wws.lanzous.com/ilphyghsgcj密码:f38a <dependency><!--jsoupHTMLparserlibrary[url=home.php?mod=space&uid=402414]@[/url]htt......
  • 多线程学习笔记
     1.进程和线程进程是指一个程序,例如QQ,打开会占用一定的内存和空间,会有产生和消亡。线程是由进程创造,一个进程可以有多个线程。单线程:在同一个时刻,只允许执行一个线程。多线程:在同一个时刻,允许执行多个线程。并发:同一时刻,多个任务交替执行,例如一台电脑同时运行qq和迅雷,看着貌似是有......
  • 使用自动模型
    本文通过文本分类任务演示了HuggingFace自动模型使用方法,既不需要手动计算loss,也不需要手动定义下游任务模型,通过阅读自动模型实现源码,提高NLP建模能力。一.任务和数据集介绍1.任务介绍前面章节通过手动方式定义下游任务模型,HuggingFace也提供了一些常见的预定义下游任务模型,如......
  • 9-3|使用Python的scikit-learn库来训练一个逻辑回归模型,检测句子是否含有侮辱性内容:
    当然可以。以下是一个简单的例子,使用Python的`scikit-learn`库来训练一个逻辑回归模型,检测句子是否含有侮辱性内容:```pythonfromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.linear_modelimportLogisticRegressionfromsklearn.model_selectionim......
  • 开放式互连系统参考模型(七层模型)
    7.应用层协议FTP:20/21(服务器协议)(20发送数据21建立控制连接)TELNET:23(远程协议)HTTP:80(超文本协议)HTTPS:443(加密超文本协议)SSH:22(高级远程)SMTP/POP3:25/110(邮件传输协议)DHCP:67/68(动态主机配置协议)()BGP:179(边界网关协议)RIP:520(路由信息协议)DNS:53(域名解析协议)TFTP:696.表示层:主要......
  • Java内存模型(JMM)详解
    面试官:讲讲什么是JMMJMM(Java内存模型)详解1什么是JMM?JMM就是Java内存模型(JavaMemoryModel)JMM是一个抽象的概念,他描述的是和多线程相关的一组规范,需要各个JVM的实现来遵守JMM规范,以便于开发者可以利用这些规范,更方便的开发多线程程序。这样一来,即使同一个程序在不同的虚拟......
  • 高性能网络通信模型——Reactor 和 Proactor
    原来8张图,就能学废Reactor和Proactor(qq.com)高并发编程--Reactor模式与Proactor模式(qq.com)Reactor模型Reactor,翻译为反应器,他是一个被动的感觉,可以理解为接收到客户端事件后,Reactor模型会根据事件类型调用相应的代码进行处理。Reactor模型也叫作Dispatcher模式,底层是......
  • 单月120篇!2023年8月diffusion生成扩散模型论文汇总
    001 (2023-08-30)SignDiff LearningDiffusionModelsforAmericanSignLanguageProduction   https://arxiv.org/pdf/2308.16082.pdf002 (2023-08-30)DiffuVolume DiffusionModelforVolumebasedStereoMatching   https://arxiv.org/pdf/2308.15989.p......