当前位置: 首页 > 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();
     }
 }


http://www.kler.cn/a/613943.html

相关文章:

  • Swift语音助手(苹果生态系统的核心编程语言)
  • Ubuntu与Windows之间相互复制粘贴的方法
  • Docker 存储管理那些事儿:简单易懂的讲解与实践示例
  • Qt跨平台文件传输系统开发全解:TCP/IP协议+多线程架构
  • pyQt学习笔记——Qt资源文件(.qrc)的创建与使用
  • 无人设备遥控器之调度自动化技术篇
  • 国产芯片解析:龙讯HDMI Splitter系列:多屏共享高清
  • 使用CSS3实现炫酷的3D视差滚动效果
  • SAP:越来越多组织通过AI解决数据问题,迈向大规模应用
  • 优化 Docker 构建之方法(Methods for Optimizing Docker Construction)
  • k8s scheduler几种扩展方式的关系及区别
  • ubuntu服务器进程启动失败的原因分析
  • 从vue2过渡到vue3
  • SQL server中的事务与锁
  • 【HCIA-网工探长】07:IP基础与ARP拓展笔记
  • Flutter环境搭建
  • MYTOOL-笔记
  • HTML应用指南:利用POST请求获取全国小鹏汽车的充电桩位置信息
  • 深度学习框架PyTorch——从入门到精通(9)PyTorch简介
  • 揭秘大数据 | 13、大数据的五大问题 之 数据科学