首页 > 其他分享 >如何使用Disruptor(二)如何从Ringbuffer读取(转)

如何使用Disruptor(二)如何从Ringbuffer读取(转)

时间:2023-08-04 17:04:58浏览次数:38  
标签:Disruptor 读取 Buffer ConsumerBarrier Ringbuffer 序号 Ring 节点 消费者


ConsumerBarrier与消费者



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



如何使用Disruptor(二)如何从Ringbuffer读取(转)_数据



(好,我开始后悔使用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去拿这些序号节点里的数据了。

如何使用Disruptor(二)如何从Ringbuffer读取(转)_Ringbuffer_02

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

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

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

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

标签:Disruptor,读取,Buffer,ConsumerBarrier,Ringbuffer,序号,Ring,节点,消费者
From: https://blog.51cto.com/u_2650279/6964789

相关文章

  • 如何使用 Disruptor(三)写入 Ringbuffer(转)
    本文的 重点 是:不要让Ring重叠;如何通知消费者;生产者一端的批处理;以及多个生产者如何协同工作。ProducerBarriersDisruptor 代码给 消费者 提供了一些接口和辅助类,但是没有给写入RingBuffer的 生产者 提供接口。这是因为除了你需要知道生产者之外,没有别人需要访问它。......
  • C# 读取json配置文件appsettings.json
    添加NuGet包Microsoft.Extensions.Configuration.FileExtensions;Microsoft.Extensions.Configuration.Json;appsettings.json示例 代码:publicstaticvoidGetBuilder(stringpath){varbuilder=newConfigurationBuilder()......
  • Qt TwinCAT3中的变量回调函数的时间戳读取方式
    官网提供了例程,官网真是个宝库。基本ADS的操作都里面有例程了,但是可能会稍微分散一点,不过多看几遍,也就慢慢整理你所需要的东西出来了。https://infosys.beckhoff.com/index_en.htm1#include<Windows.h>2#include<conio.h>3#include<winbase.h>45#include<TcA......
  • shell 读取文件内容到数组
     在shell脚本中,可以使用下面的语法来读取文件内容并将其存储到数组中: bash复制代码array=()whilereadline;doarray+=("$line")done<file.txtLOG_INFO(){localcontent=${1}echo-e"\033[32m[INFO]${content}\033[0m"}IFS=''catbanner.......
  • shell 将文件内容读取到 数组中
    #!/bin/bashprod_file=/home/vmuser/linbo/kettleDemo/job/test/CA-20201224.csvtest_file=/home/vmuser/linbo/kettleDemo/job/test/uat_CA-20201224.csvdtm=`date+"%Y%m%d%H%M%S"`echo$dtmrowCnt=`cat$test_file|wc-l`echo$rowCntecho"-----......
  • excel递归读取目录并输出
    添加依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> ......
  • UE5 蓝图运行时错误:"“无访问”正在尝试读取属性
    场景测试DBBrowser控件,打开网页功能,调试错误:蓝图运行时错误:"“无访问”正在尝试读取属性DBBrowserUI0"。节点:LoadURL图表:EventGraph函数:ExecuteUbergraphLoginUI蓝图:LoginUI分析当前问题是创建了一个DBBrowser的变量,但是没有给它赋值,就直接调用了,导致该值是空的,从而......
  • 通过读取yaml文件获得多个参数
    importpytestimportrequestsfromutils.read_yamlimportget_yaml_data#多个参数(’class1,class2‘,[('age','eat'),('age','eat')])@pytest.mark.parametrize('title,body,userId',[get_yaml_data()['list_test&#......
  • 单细胞实战(1)数据下载-数据读取-seurat对象创建
    这篇文章我们将介绍从geo数据库下载单细胞测序数据后,多种数据格式多样本情况下,如何读取数据并创建seurat对象。本文主要结构:一、数据下载二、数据读取与seurat对象创建单样本情况下各种格式数据的读取,读取后seurat对象的创建多样本情况下各种格式数据的读取,读取后seurat对象......
  • [转载]Vbox中自动挂载共享文件夹的读取
    转载自Ubuntu中文论坛本文只解决在使用共享文件夹时勾选自动挂载的选项自动挂载被勾选后,虚拟机会自动在目录/media下建立"sf_NAME"的挂载点,其中NAME为在Windows的Vbox中设置的共享文件夹的名称./media目录为Linux为了挂载外部存储设备而设立的目录问题就出在这个挂......