英文原文:http://ifeve.com/dissecting-the-disruptor-how-do-i-read-from-the-ring-buffer/

作者:Trisha  译者:古圣昌  校对:方腾飞

从上一篇文章中我们都了解了什么是Ring Buffer以及它是如何的特别。但遗憾的是,我还没有讲述如何使用DisruptorRing Buffer写数据和从Ring Buffer中读取数据。

ConsumerBarrier与消费者

这里我要稍微反过来介绍,因为总的来说读取数据这一过程比写数据要容易理解。假设通过一些“魔法”已经把数据写入到Ring Buffer了,怎样从Ring Buffer读出这些数据呢?

(好,我开始后悔使用Paint/Gimp 了。尽管这是个购买绘图板的好借口,如果我继续写下去的话… UML界的权威们大概也在诅咒我的名字了。)

消费者(Consumer)是一个想从Ring Buffer里读取数据的线程,它可以访问ConsumerBarrier对象——这个对象由RingBuffer创建并且代表消费者与RingBuffer进行交互。就像Ring Buffer显然需要一个序号才能找到下一个可用节点一样,消费者也需要知道它将要处理的序号——每个消费者都需要找到下一个它要访问的序号。在上面的例子中,消费者处理完了Ring Buffer里序号8之前(包括8)的所有数据,那么它期待访问的下一个序号是9

消费者可以调用ConsumerBarrier对象的waitFor()方法,传递它所需要的下一个序号.

 final long availableSeq = consumerBarrier.waitFor(nextSequence);

ConsumerBarrier返回RingBuffer的最大可访问序号——在上面的例子中是12ConsumerBarrier有一个WaitStrategy方法来决定它如何等待这个序号,我现在不会去描述它的细节,代码的注释里已经概括了每一种WaitStrategy的优点和缺点 。

接下来怎么做?

接下来,消费者会一直原地停留,等待更多数据被写入Ring Buffer。并且,一旦数据写入后消费者会收到通知——节点9101112 已写入。现在序号12到了,消费者可以让ConsumerBarrier去拿这些序号节点里的数据了。

拿到了数据后,消费者(Consumer)会更新自己的标识(cursor)。

你应该已经感觉得到,这样做是怎样有助于平缓延迟的峰值了——以前需要逐个节点地询问“我可以拿下一个数据吗?现在可以了么?现在呢?”,消费者(Consumer)现在只需要简单的说“当你拿到的数字比我这个要大的时候请告诉我”,函数返回值会告诉它有多少个新的节点可以读取数据了。因为这些新的节点的确已经写入了数据(Ring Buffer本身的序号已经更新),而且消费者对这些节点的唯一操作是读而不是写,因此访问不用加锁。这太好了,不仅代码实现起来可以更加安全和简单,而且不用加锁使得速度更快。

另一个好处是——你可以用多个消费者(Consumer)去读同一个RingBuffer ,不需要加锁,也不需要用另外的队列来协调不同的线程(消费者)。这样你可以在Disruptor的协调下实现真正的并发数据处理。

BatchConsumer代码是一个消费者的例子。如果你实现了BatchHandler, 你可以用BatchConsumer来完成上面我提到的复杂工作。它很容易对付那些需要成批处理的节点(例如上文中要处理的9-12节点)而不用单独地去读取每一个节点。

更新:注意Disruptor 2.0版本使用了与本文不一样的命名。如果你对类名感到困惑,请阅读我的变更总结

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 如何使用Disruptor(二)如何从Ringbuffer读取

如何使用Disruptor(二)如何从Ringbuffer读取相关推荐

  1. NX二次开发-UFUN读取图纸尺寸的值UF_DRF_ask_dimension_text

    NX二次开发-UFUN读取图纸尺寸的值UF_DRF_ask_dimension_text 今天发现UF_DRF_ask_dim_info这个函数不能读带附件文本的尺寸,有附加文本dim_info-&g ...

  2. 生成二维码,读取二维码,这很Python(23)

    小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生. 欢迎和猫妹一起,趣味学Python. 今日主题 如何用Python生成二维码. 如何用Python读取二维码. 什么是二维码 二 ...

  3. c#生成图片、生成二维码、读取excel、自动匹配路径

    以下是个园林树牌信息生成程序,是使用c#语言编写的控制台程序,包含了生成图片.生成二维码.读取excel.自动匹配路径等功能,可作为以上功能的demo.注意只有系统中已有的字体才可以使用,如果使用系统 ...

  4. Python 二维码的读取与生成:使用链接生成二维码、读取二维码里的链接

    Python 二维码的读取与生成演示 ① 使用链接生成二维码 ② 读取二维码里的链接 [ 文章推荐 ] Python 绘制中国地图:使用 pyecharts 最新版本绘制中国地图实例详解,个性化地图定 ...

  5. zxing.net 0.16.8生成二维码,读取二维码,读取多个二维码 c#

    更新到新版本,报错.老版本的函数发现少了很多.把少的文件添加到目录中,发现可以用了. using System.Diagnostics; using System.Text; using ZXing; ...

  6. es elasticsearch 几种常见查询场景 二次分组 java读取es的查询json文件

    大家好,我是烤鸭: es中几种常见的查询场景,使用java读取es的json文件进行查询. es 中文使用手册. https://www.elastic.co/guide/cn/elasticsear ...

  7. NX二次开发-UFUN读取属性的值UF_ATTR_read_value

    在UG/NX二次开发中,我们与属性相关的函数都在UF_ATTR这个头文件里面, 其中读取属性的值UFUN函数是UF_ATTR_read_value 下面一个例子来介绍,这个API是怎么使用的. NX9 ...

  8. disruptor 框架使用以及ringbuffer原理解析

    Disruptor 概述 子主题 1 从功能上来看,Disruptor 是实现了"队列"的功能,而且是一个有界队列.那么它的应用场景自然就是"生产者-消费者"模 ...

  9. android Zxing二维码之读取手机二维码图片

    使用最新(注意这里是使用最新版的基于ZXing3.1封装:https://github.com/xuyisheng/ZXingLib) 功能是很全面的,扫描,生成,读取手机. 在这里只记录下读取手机相 ...

  10. java生成二维码,读取(解析)二维码图片

    二维码分为好多种,我们最常用的是qrcode类型的二维码,以下有三种生成方式以及解析方式: 附所需jar包或者js地址 第一种:依赖qrcode.jar import java.awt.Color; ...

最新文章

  1. Creating Lists
  2. Linux 64bit下Oracle11g安装手册
  3. 学习笔记Kafka(一)—— Kafka简介
  4. 视图 - 创建及修改视图
  5. 倍福(Beckhoff)嵌入式控制器PLC
  6. UVa 208 Firetruck【回溯】
  7. python webdriver 等待网页已登录_python基础编程:python+selenium实现163邮箱自动登陆的方法...
  8. 作者:孙宗哲(1991-),男,东北大学软件学院硕士生
  9. Excel 批量处理行高(图文教程) - Excel篇
  10. 繁体中文转换为简体中文的PHP类
  11. nasa和linux的关系,跟美国NASA毅力号登陆火星的Linux是一个无图形的纯命令行系统...
  12. sql between的用法的意思_SQL 宝典——SQL 语法速成手册
  13. 网页布局02 盒子模型
  14. node中exports和module.exports的关系及使用
  15. html权重值_实战:网站权重快速提高权重绝招(10天权3)
  16. python社团宣传语_宣传语_Python语言及其应用_红黑联盟读书频道
  17. 新站如何做到短时间内获得大量的seo流量?
  18. torch.Longtensor是什么?和torch.Tensor有什么区别?
  19. js 输出为underfined
  20. 人脸服务器如何与门禁系统对接,安全升级!人脸识别门禁终端集门禁考勤访客对讲一步到位...

热门文章

  1. 阶段3 1.Mybatis_06.使用Mybatis完成DAO层的开发_4 Mybatis中使用Dao实现类的执行过程分析-查询方法...
  2. 创建一个WPF+EF应用程序
  3. JS学习之表格的排序
  4. C#/ASP.NET MVC微信公众号接口开发之从零开发(三)回复消息 (附源码)
  5. 软件自动化测试学习步骤
  6. 2b青年欢乐多之地铁奇幻记
  7. SpringBoot学习笔记(15):动态数据源切换
  8. 基于bootstrap table配置的二次封装
  9. day22 属性 类方法 静态方法 反射 https://www.cnblogs.com/jin-xin/articles/9214247.html
  10. 记录一下 orangepi zero wifi联网