当前位置: 首页 > article >正文

3.0 Disruptor的使用介绍(一)

        Disruptor:  其官网定义为:“A High Performance Inter-Thread Messaging Library”,即:线程间的高性能消息框架,与Labview的生产者、消费者模型很相似。

        其组成部分比较多,先介绍几个常用的概念:       

1.  Ring Buffer: Disruptor中的数据结构,用于存储生产者生产的数据。环形的缓冲区。
2.  Producer 即生产者,只是泛指调用 Disruptor 发布事件的对象   
3.  Consumer 消费者。处理事件(数据)的对象。
4.  Event 事件(数据)从生产者到消费者传递的数据叫做Event。
5.  EventHandler. 事件处理接口,事件(数据发布后) 触发该事件。

        ringbuffer可以理解成下面的样子。

一、理论比较复杂,先以一个实际案例感受下:

1. 建立一个ringbuffer,并且指定大小为8; 本窗体为消费者处理窗体

 private static readonly int _ringSize = 8;      //定义环大小
 private RingBuffer<PointPair> ringbuffer;   //

   var dis = new Disruptor.Dsl.Disruptor<PointPair>(
    () => new PointPair(), _ringSize, TaskScheduler.Default);
   dis.HandleEventsWith(this);      //定义本窗体作为事件的处理窗口。
   ringbuffer = dis.Start();

2.生产者使用时,在ringbuffer上申请一个序号,把内容填充后,发布(发送出去)

  long seqNo = ringbuffer.Next();    //从ringbuffer中申请一个位置(序号)
  PointPair NewPoint = ringbuffer[seqNo];
  NewPoint.X = .....;
  NewPoint.Y = .....);                       
  ringbuffer.Publish(seqNo);      //修改后,进行发布。

3. 有事件过来。消费者进行处理。

 public void OnEvent(PointPair data, long sequence, bool endOfBatch)
 {

        //

}

二、实际案例:

首先,通过Nuget安装4.0.0.0版本的Disruptor, 以及ZedGraph。最终效果如下(代码见下链接):

Disruptor的使用介绍(一),最简单的例子资源-CSDN文库

https://download.csdn.net/download/qq_34047402/90530673

 public partial class Form1: Form, IEventHandler<PointPair>{private static readonly int _ringSize = 8;private RingBuffer<PointPair> ringbuffer;PointPairList list1 = new PointPairList();public Form1(){InitializeComponent();var dis = new Disruptor.Dsl.Disruptor<PointPair>(() => new PointPair(), _ringSize, TaskScheduler.Default);dis.HandleEventsWith(this);ringbuffer = dis.Start();createPane(this.zedGraphControl1);Task.Factory.StartNew(() =>{while(true){Thread.Sleep(500);long seqNo = ringbuffer.Next();PointPair NewPoint = ringbuffer[seqNo];NewPoint.X = this.list1[this.list1.Count - 1].X + 1;NewPoint.Y = Math.Sin((double)NewPoint.X * 0.2);                       ringbuffer.Publish(seqNo);}});//Task.Factory.StartNew(//   () =>//   {//       while (true)//       {//           Thread.Sleep(500);//           long seqNo = ringbuffer.Next();//           PointPair NewPoint = ringbuffer[seqNo];//           NewPoint.X = this.list1[this.list1.Count - 1].X + 1;//           NewPoint.Y =3* Math.Sin((double)NewPoint.X * 0.2);//           ringbuffer.Publish(seqNo);//       }//   }//   );}public void OnEvent(PointPair data, long sequence, bool endOfBatch){list1.RemoveAt(0);list1.Add(data);if (this.zedGraphControl1.InvokeRequired){this.zedGraphControl1.Invoke(new Action(delegate{this.zedGraphControl1.AxisChange();this.zedGraphControl1.Refresh();}));}else{this.zedGraphControl1.AxisChange();this.zedGraphControl1.Refresh();}}private void createPane(ZedGraphControl zgc){//得到GraphPane的引用GraphPane myPane = zgc.GraphPane;// 设置标题 myPane.Title.Text = "Disruptor的介绍";myPane.XAxis.Title.Text = "My X Axis";myPane.YAxis.Title.Text = "My Y Axis";//生成正弦函数的数据集合 double x, y1, y2;for (int i = 0; i < 36; i++){x = (double)i ;y1 = Math.Sin((double)i * 0.2);list1.Add(x, y1);}//用钻石符合形状生成红色的曲线和图例LineItem myCurve = myPane.AddCurve("Porsche",list1, Color.Red, SymbolType.Diamond);//利用圆型的符号生成蓝色的曲线和图例        zgc.AxisChange();}}

相关文章:

3.0 Disruptor的使用介绍(一)

Disruptor: 其官网定义为&#xff1a;“A High Performance Inter-Thread Messaging Library”&#xff0c;即&#xff1a;线程间的高性能消息框架&#xff0c;与Labview的生产者、消费者模型很相似。 其组成部分比较多&#xff0c;先介绍几个常用的概念&#xff1a; …...

基础实验2-2.1 整数的分类处理

基础实验2-2.1 整数的分类处理 - 浙大版《数据结构学习与实验指导&#xff08;第2版&#xff09;》题目集 (pintia.cn) 给定 N 个正整数&#xff0c;要求你从中得到下列三种计算结果&#xff1a; A1 能被 3 整除的最大整数A2 存在整数 K 使之可以表示为 3K1 的整数的个数A3…...

[深度学习]图像分类项目-食物分类

图像分类项目-食物分类(监督学习和半监督学习) 文章目录 图像分类项目-食物分类(监督学习和半监督学习)项目介绍数据处理设定随机种子读取文件内容图像增广定义Dataset类 模型定义迁移学习 定义超参Adam和AdamW 训练过程半监督学习定义Dataset类模型定义定义超参训练过程 项目介…...

有价值的面试问题

迅雷一面 都是c和网络问题 了解epoll吗&#xff1f;解释下水平触发和边缘触发&#xff0c;医院的叫号系统应该算哪一种 c类a有成员b&#xff0c;成员b调用了a的函数&#xff0c;但是a不小心把b的成员删除了&#xff0c;会发生什么&#xff0c;怎么解决 c类a有一个static的函数…...

禁用ONLY_FULL_GROUP_BY模式

这是由于MySQL启用了ONLY_FULL_GROUP_BY模式导致的。以下是禁用该模式的三种方法&#xff0c;结合你的需求选择最合适的方案&#xff1a; 一、临时禁用&#xff08;重启后失效&#xff09; 1. 当前会话禁用 直接在SQL客户端执行以下命令&#xff0c;仅对当前数据库连接有效&…...

SAP 获取RFC的WSDL文件

主要是CPI要用到WSDL文件做mapping&#xff0c;客户的SAP服务器不一定直接可在浏览器访问http或者https的地址&#xff0c;所以在SAP里面开发程序内部调用地址获取WSDL文件 *&---------------------------------------------------------------------* *& Report YXX_…...

SQLite优化实践

1. 启用写入批处理 使用事务将多条插入操作包装在一起&#xff0c;这样可以减少磁盘I/O和日志的写入。 BEGIN TRANSACTION; -- 执行多个INSERT语句 COMMIT;通过将多个插入操作包装在一个事务中&#xff0c;可以显著减少每次写入数据库时的磁盘I/O操作。 2. 使用更大的页大小…...

56.fm解调最简单的方法过零检测,如何确定计时器的更新速率

&#xff0c;...

java8循环解压zip文件---实现Excel文件数据追加

java8循环追加Excel数据 实际遇到问题&#xff1a;定期获取zip文件&#xff0c;zip文件内有几个固定模板的Excel文件&#xff0c;有的Excel文件可能还包含多个sheet。 有段时间一次性获取到好几个zip包&#xff0c;需要将这些包都解压&#xff0c;并且按照不同的文件名、sheet进…...

基于SpringBoot的电影售票系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

SQL Server 2022 安装问题

一、安装与配置问题 1. SQL Server 2022 安装失败怎么办&#xff1f; 常见原因&#xff1a; 硬件或操作系统不满足最低要求&#xff08;如内存、磁盘空间不足&#xff09;。未关闭防火墙或杀毒软件。之前版本的 SQL Server 残留文件未清理。 解决方案&#xff1a; 确保硬件配…...

MySQL 8.0.41安装教程(附安装包)mysql8.0.41图文详细安装教程

文章目录 前言一、MySQL 8.0.41下载安装包二、MySQL 8.0.41安装教程1.启动安装程序2.选择安装模式3.选定安装组件4.确认安装设置5.执行安装操作6.安装进行中7.设置数据库密码8.继续点击下一步9.执行配置操作10.完成配置11. 再次点击下一步12.结束安装向导 三、MySQL 8.0.41配置…...

React Router使用方法

目录 简介React Router的三种使用模式声明模式数据模式框架模式 React Router7声明模式使用方法在入口文件引入BrowserRouter配置一个路由组件管理路由将路由组件引入App.tsx嵌套路由链接式路由导航 \ 和 \<Link>编程式路由导航 简介 React Router 是 React 的多策略路由…...

2025年陕西省各市秦创原产业创新聚集区(机器人、羊乳、苹果)“四链”融合项目申报补贴要求和时间流程

征集2025年陕西省各市秦创原产业创新聚集区&#xff08;机器人、羊乳、苹果&#xff09;“四链”融合项目申报补贴要求和时间流程&#xff0c;更多详情请大家参考下文&#xff01;西安市、宝鸡市、咸阳市、铜川市、渭南市、延安市、榆林市、汉中市、安康市、商洛市10市各地需要…...

深入解析 C++20 中的 std::bind_front:高效函数绑定与参数前置

文章目录 1. 什么是 std::bind_front&#xff1f;2. 使用 std::bind_front2.1 基本用法2.2 绑定多个参数 3. 优势与特点3.1 简化代码3.2 支持可调用对象3.3 支持完美转发 4. 实际应用场景4.1 事件处理4.2 算法通用化4.3 成员函数调用 5. 总结 在现代 C 编程中&#xff0c;函数绑…...

python裁剪nc文件数据

问题描述&#xff1a; 若干个nc文件储存全球的1850-2014年月尺度的mrro数据(或其他数据)&#xff0c;从1850-1到2014-12一共1980个月&#xff0c;要提取出最后35年1980.1~2014.12年也就是420个月的数据。 代码实现 def aaa(input_file,output_file,bianliang,start_index,en…...

数据治理之数据仓库

本文主要阐述了数据仓库在大数据平台项目中的地位和重要性,对目前市场上数据仓库主流设计进行分析说明,讲述了通用数据仓库设计上所应考虑的因素。 数据仓库介绍 数据仓库是一个过程而不是一个项目;数据仓库是一个环境,而不是一件产品。数据仓库提供用户用于决策支持的当前…...

QILSTE H6-108QFO高亮橙光LED灯珠 发光二极管LED

# H6-108QFO LED 产品参数解析与应用指南 ## 一、产品概述 H6-108QFO 是一款尺寸为 1.6x0.8x0.55mm 的高亮橙光 LED 产品&#xff0c;采用透明平面胶体设计&#xff0c;符合 EIA 规范标准包装&#xff0c;达到环保 ROHS 要求&#xff0c;防潮等级为 Level 3&#xff0c;适用于…...

2503C++,C++标准的执行

最优雅的应该是c26刚刚引入的std::execution,通过sender/receiver模型和常用的异步算法来简化调用异步逻辑,还可随时改成协程. #include <stdexec/execution.hpp> #include <exec/static_thread_pool.hpp> int main() {exec::static_thread_pool pool(3);auto sch…...

CSS网格布局Grid

目录 一、Grid 网格布局 1.Grid 布局基础 2.网格容器属性 3.网格项目属性 4.高级功能 5.典型应用场景 6.最佳实践 二、Flex和Grid对比 示例&#xff1a; 一、Grid 网格布局 CSS Grid 是一种强大的二维布局系统&#xff0c;能够以行和列的方式精确控制网页布局。它比传…...

微服务架构中的服务发现与 Consul 实践

在微服务架构中&#xff0c;服务之间的通信是核心问题之一。随着服务数量的增长&#xff0c;如何高效地管理和定位服务实例变得尤为重要。本文将介绍服务发现的基本概念&#xff0c;并详细讲解如何使用 Consul 进行服务注册、发现和健康检查。 1. 什么是服务发现&#xff1f; …...

医院挂号预约小程序|基于微信小程序的医院挂号预约系统设计与实现(源码+数据库+文档)

医院挂号预约小程序 目录 基于微信小程序的医院挂号预约系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、小程序用户端 2、系统服务端 &#xff08;1&#xff09; 用户管理 &#xff08;2&#xff09;医院管理 &#xff08;3&#xff09;医生管理 &#xf…...

Emacs 折腾日记(十九)——配置输入法和vim操作方式

上一篇文章中&#xff0c;我们将Emacs变得稍微好看了点。换成了自己喜欢的主题和颜色&#xff0c;这样每天用起来也比较养眼&#xff0c;不会特别排斥。本篇文章的主要任务就是配置输入法方便输入中文以及将vim的操作模式搬到Emacs中。进一步提到Emacs的可用性 配置中文输入法…...

蓝桥杯第十届 特别的数

题目描述 小明对数位中含有 2、0、1、9 的数字很感兴趣&#xff08;不包括前导 0&#xff09;&#xff0c;在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40&#xff0c;共 28 个&#xff0c;他们的和是 574。 请问&#xff0c;在 1 到 n 中&#xff0c;所有这样的数的…...

Qt开发:QInputDialog的使用

文章目录 一、QInputDialog的介绍二、 QInputDialog的基本用法三、使用 QInputDialog的实例四、QInputDialog的信号与槽 一、QInputDialog的介绍 QInputDialog 是 Qt 提供的一个对话框类&#xff0c;用于获取用户输入的文本、整数或浮点数。它提供了简单易用的静态方法和可定制…...

redis--JavaSpring客户端

目录 一、引言 二、配置 三、相关操作 四、总结 一、引言 本篇文章会将redis与spring项目进行结合&#xff0c;看看再spring项目中&#xff0c;redis是如何使用的 二、配置 三、相关操作 四、总结 在spring项目中的使用和在基础项目上的使用有差异&#xff0c;但是差异并不大…...

2、二分和贪心

一、二分 这里有个小技巧&#xff0c;你会发现&#xff0c;只要是求最大最小最多等等的贪心过程&#xff0c;我们就有3种方法&#xff1a;①二分②贪心算法③动态规划 我们先讲二分和贪心&#xff0c;动态规划比较麻烦&#xff0c;留到后期。 1、了解 2、模版 class Solution …...

QuecPython 网络协议之TCP/UDP协议最祥解析

概述 IP 地址与域名 IP 地址是网络中的主机地址&#xff0c;用于两台网络主机能够互相找到彼此&#xff0c;这也是网络通信能够成功进行的基础。IP 地址一般以点分十进制的字符串来表示&#xff0c;如192.168.1.1。 ​ 我们日常访问的网站&#xff0c;其所在的服务器主机都有…...

ISIS-2 邻居建立关系

上一章我们介绍了ISIS的基础概念以及报文内容和作用在什么样的场景下面的 这一章我们来介绍IS-IS的邻居建立关系 一、概念 IS-IS中路由器的角色可分为L1、L2、L1/2这三种类型其中的L1/L2有点类似与我们OSPF中的ABR IS-IS中的邻居关系分为L1与L2邻居关系,其中所有建立L2邻居关…...

Nature Machine Intelligence 嵌入式大语言模型使机器人能够在不可预测的环境中完成复杂的任务

近期英国爱丁堡大学发表Nature Machine Intelligence研究工作&#xff0c;提出了一种名为ELLMER&#xff08;具身大型语言模型支持机器人&#xff09;的创新框架&#xff0c;通过整合大型语言模型&#xff08;如GPT-4&#xff09;、检索增强生成&#xff08;RAG&#xff09;、视…...