项目开发中使用并发模型常见问题的整理与思考

需求: 数量不定,会定期更新数据,且数据量大的一堆数据,需要在短时间内调用某个接口获取到所有的数据,随后根据返回的json键值进行分类处理。

需求如上,初步分析,我们必然会用到多线程来做,即开一定数量的线程去调用接口获取数据,随后处理返回的json数据,这一套我们需要分开来做,调用接口获取数据我们可以看成是生产者,而处理返回的数据,将其分类就可以看作是消费者。那么,现在我们要来思考下采用这套模型可能会产生的问题。首先,如果生产者生产的数据的速度小于消费者消费的速度,那么此时,我们就需要挂起消费者线程,直到生产者生产了数据,也就是说,在生产者与消费者之间存储数据的容器,我们需要慎重选择,不能仅仅选择队列数据结构来存储,考虑到这种情况,我们可以换成阻塞队列这种数据结构来作为生产者-消费者模型的中间容器层。

容器的问题解决了,那么接下来还需要继续分析。在此模型中,生产者一边生产数据,消费者一边消费数据,但是就算是再多的数据,也会出现获取完的时候,那么我们此时如何标记生产者已经没有数据再能生产了呢?如何将这个信息通知给消费者?不能简单地通过队列中数据的数量来判断,由于我们是一边消费一边生产的,因此队列中的数据量就会不准。我们可以引入一个线程安全的队列来记录每一次生产者生产的数据量。然后再消费者那边做一个判断,如果此时的标记队列的数量恰好就是总的数据量,那么关闭生产者线程,同时,当消费者线程消费完容器阻塞队列中的数据的时候,就完成了所有的操作,此时跳出所有的循环,不再启用线程处理。在这里我们引入了一个第三方的队列来判断,从空间以及时间来看,增加了一点内存,也耗费了大概几百ms到1s左右的时间,可以忽略,但是我们也有第二种方法来实现,那就是利用原子锁,原子锁本就是为了维护值类型即整型之类的线程安全性,我们完全可以原子锁来做实现,而且是无锁操作。

具体代码demo请看:

[置顶]我的.net并发系列文章及项目经验整理

原文地址:https://www.cnblogs.com/zhiyong-ITNote/p/8715568.html

时间: 2024-10-06 11:46:52

项目开发中使用并发模型常见问题的整理与思考的相关文章

iOS项目开发中的知识点与问题收集整理(Part 一)

前言部分 注:本文并非绝对原创 大部分内容摘自 http://blog.csdn.net/hengshujiyi/article/details/20943045 文中有些方法可能已过时并不适用于现在的开发环境. 1.Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view  [[self.searchBar.subviews objectAtIndex:0]

iOS项目开发中的知识点与问题收集整理

注:本文并非绝对原创 大部分内容摘自 http://blog.csdn.net/hengshujiyi/article/details/20943045 文中有些方法可能已过时并不适用于现在的开发环境. 1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view  [[self.searchBar.subviews objectAtIndex:0] remov

项目开发中应用并发的一二事

在多线程环境下,使用BlockingCollection以及ConcurrentQueue来消费生产者生产的资源,这是我自己写的多生产者多消费者的作法,其实也是基于单个task下的阻塞队列的IsComplete来识别的. 使用阻塞队列更简单但是内部的消费者线程比较适合使用单独的线程不适合使用线程池,而且阻塞队列为空时会阻塞消费者线程,当然阻塞线程池内的线程也没什么影响只是不推荐这么做,而且阻塞的队列的性能也没有ConcurrentQueue的性能高. 我在项目中遇到多生产者多消费者问题,多生产者

项目开发中遇到的extjs常见问题

1 事件触发机制 2 3 l 给某一个控件添加事件. 4 5 obj.addEvents( {search : true }); 6 7 l 给某一个事件添加处理函数 8 9 n 给一个对象或变量添加监听及对应得处理,可以在创建时,通过属性listener添加. 10 11 n 或者通过 obj.on(‘event’,function(){}) 12 13 n 或者通过obj.addListener(“event”,function) 14 15 16 17 l 出发一个事件,params是要传

项目开发中常用的PHP函数

日期操作 为了便于存储.比较和传递,我们通常需要使用strtotime()函数将日期转换成UNIX时间戳,只有在显示给用户看的时候才使用date()函数将日期转换成常用的时间格式. strtotime()  函数将任何英文文本的日期时间描述解析为 Unix 时间戳 eg: <?php echo(strtotime("now")); echo(strtotime("3 October 2005")); echo(strtotime("+5 hours&

逆向思维在项目开发中真的很重要

最近一直和我的小组开发一个投资类型的网站,网站的整体已经完成得差不多了,客户今天突然提出了一个要求,希望能够在所有人退出当前聊天大厅后,后面进入的人不能够看到之前用户的聊天记录(原来是可以看到的).由于聊天室代码是别人写的,且基本算木有注释,也木有相关的文档.研究源码太耗时间了,由于聊天数据比较小,聊天室窗口是从messages表中读取的数据,所以打算当用户退出时,执行某一机制将Ajax_chat_messages表中对应聊天室的数据copy到一个新的Chat_messages表中,同时清除Aj

在复杂的项目开发中使用结对编程

在复杂的项目开发中使用结对编程 卢占辉译 在开发软件项目时,不仅写出相应功能的模块很重要:确保写出的模块的易维护性(bug 修复,代码重构)也同样重要. 主打互联网技术和门户网站的Perpetuum 手机公司曾开展了一个长期的软件项目,以研制出一套基于web的内容管理软件.Perpetuum公司的许多开发者都参与了这个项目.项目中大部分复杂的模块都是完全靠个人开发的(非多人协作完成).维护这些模块(即非多人协作完成的模块)非常困难.因为开发某一模块的人还需要开发新的模块或者维护另一既有模块,这需

SSH项目开发中,将jsp页面放在WEB-INF的原因解析

 在一些安全型要求比较高的项目开发中,我们经常看到jsp页面都被放在WEB-INF下面了.这是出于对安全性的考虑, 是为了代码的安全.这样实现起来虽然麻烦了点,而且页面跳转很不方便.但是整个项目的安全性就提高上去了!所 以还是建议在一些安全性要求比较高的项目里使用这种做法! 这是我写的一个例子,我就是将所有的JSP页面都放在WEB-INF下面,然后按照模块进行分配,course文件夹就是放和 课程信息管理相关的JSP页面.假如我们输入https://localhost:8080/项目名称/p

项目开发中db设计

项目开发中db设计 0.根据原型分析出数据的由来和数据间的关系(实体关系); 1.提取字段,通过powerDesigner设计表; 2.先不加约束,先只建立数据上的单向关联,有需要时在建立双向关联或中间表;3.也可以先建立外键关系,最后删除外键关系;(方便查看表的关系);4.对实体对象通常会补充的字段:     id         主键    entity        关联实体/自己    isDelete varchar(1)  Null    #是否删除    CreateEmpId v