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.pswp.cn/web/73316.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73316.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73316.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在 Windows 系統下,將 FFmpeg 編譯為 .so 文件

1. 準備環境 確保你的 Windows 系統已安裝以下工具&#xff1a; Android Studio NDK&#xff08;Native Development Kit&#xff09; MSYS2&#xff08;用于提供類 Unix 環境&#xff09; FFmpeg 源碼 Git Bash&#xff08;可選&#xff0c;推薦使用&#xff09; 安裝 …

leetcode二叉樹3

404.左葉子之和 給定二叉樹的根節點 root &#xff0c;返回所有左葉子之和。 示例 1&#xff1a; 輸入: root [3,9,20,null,null,15,7] 輸出: 24 解釋: 在這個二叉樹中&#xff0c;有兩個左葉子&#xff0c;分別是 9 和 15&#xff0c;所以返回 24示例 2: 輸入: root [1] 輸…

QT網絡通信的接口與使用

文章目錄 前言1.服務端實現流程1.1步驟 1&#xff1a;創建 QTcpServer 并監聽端口1.2步驟 2&#xff1a;處理新連接請求1.3步驟 3&#xff1a;接收客戶端數據1.4步驟 4&#xff1a;處理客戶端斷開 2.客戶端實現流程2.1步驟 1&#xff1a;創建 QTcpSocket 并連接服務器2.2步驟 2…

華為OD機試2025A卷七日集訓第1期 - 按算法分類,由易到難,循序漸進,玩轉OD(Python/JS/C/C++)

目錄 一、適合人群二、本期訓練時間三、如何參加四、7日集訓第1期五、精心挑選21道高頻100分經典題目&#xff0c;作為入門。第1天、邏輯分析第2天、邏輯分析第3天、邏輯分析第4天、邏輯分析第5天、雙指針第6天、二叉樹第7天、回溯 六、集訓總結六、國內直接使用最新GPT-4.5、滿…

Qt 重入和線程安全

重入和線程安全 在整個文檔中&#xff0c;"重入"和 "線程安全 "這兩個術語被用來標記類和函數&#xff0c;以表明它們在多線程應用程序中的使用方式&#xff1a; 線程安全函數可以同時被多個線程調用&#xff0c;即使調用使用的是共享數據&#xff0c;因…

Elasticsearch:構建 AI 驅動的搜索體驗

Elasticsearch 介紹 當你開始使用 Elastic 時&#xff0c;你將使用 Elasticsearch Relevance Engine?&#xff08;ESRE&#xff09;&#xff0c;它專為 AI 搜索應用程序提供支持。借助 ESRE&#xff0c;你可以利用一整套開發者工具&#xff0c;包括 Elastic 的文本搜索、向量…

鴻蒙生態開發

鴻蒙生態開發概述 鴻蒙生態是華為基于開源鴻蒙&#xff08;OpenHarmony&#xff09;構建的分布式操作系統生態&#xff0c;旨在通過開放共享的模式連接智能終端設備、操作系統和應用服務&#xff0c;覆蓋消費電子、工業物聯網、智能家居等多個領域。以下從定義與架構、核心技術…

JVM如何處理Java中的精度轉換: 從源碼到字節碼

你好&#xff0c;我是 shengjk1&#xff0c;多年大廠經驗&#xff0c;努力構建 通俗易懂的、好玩的編程語言教程。 歡迎關注&#xff01;你會有如下收益&#xff1a; 了解大廠經驗擁有和大廠相匹配的技術等 希望看什么&#xff0c;評論或者私信告訴我&#xff01; 文章目錄 一…

vue-next-admin修改配置指南

官方文檔地址&#xff1a;vue-next-admin 1.如何開啟側邊欄logo 在scr-layout-navbars-topBar-setings.vue中添加 getThemeConfig.value.isShowLogo true; 設置為true即可默認打開 2.修改側邊欄頂部的logo與文字 先把想要的圖標存到我的項目然后下載 然后把后面的幾個文件拉…

gin學習

gin學習筆記&#xff0c;不僅包含了基本的增刪查改外&#xff0c;還包括參數傳遞&#xff0c;上傳下載&#xff0c;模版、session與中間件等&#xff0c;方便收藏自習可用 文章目錄 獲得個請求get打印字符串get請求xmlget請求跳轉http方法路由可以通過Context的Param方法來獲取…

Flutter運行錯誤:UG! exception in phase ‘semantic analysis‘

最近在Mac Mini M4上通過Android Studio導入Flutter項目并運行&#xff0c;結果一直跑不起來&#xff0c;錯誤日志如下&#xff1a; 執行命令查看版本信息&#xff1a; flutter doctor --verbose通過輸出信息Java version OpenJDK Runtime Environment (build 21.0.41242208…

【計算機網絡運輸層詳解】

文章目錄 一、前言二、運輸層的功能1. 端到端通信2. 復用與分用3. 差錯檢測4. 流量控制5. 擁塞控制 三、運輸層協議&#xff1a;TCP 和 UDP1. TCP&#xff1a;面向連接的可靠傳輸協議2. UDP&#xff1a;無連接的傳輸協議 四、端口號與進程通信1. 端口號分類2. 端口通信模型 五、…

51單片機和STM32 入門分析

51單片機和STM32是嵌入式開發中兩種主流的微控制器&#xff0c;它們在架構、性能、應用場景等方面存在顯著差異。以下是兩者的對比分析及選擇建議&#xff1a; 1. 51單片機與STM32的定義與特點 51單片機 定義&#xff1a;基于Intel 8051內核的8位微控制器&#xff0c;結構簡單…

開源視覺語言模型MiniMax-VL-01:動態分辨率+4M超長文本,性能比肩GPT-4o

在人工智能領域&#xff0c;構建能夠像人類一樣理解、思考和行動的智能體&#xff08;AI Agent&#xff09;一直是研究人員的終極目標之一。而實現這一目標的關鍵在于模型是否具備足夠強大的感知能力、記憶能力和推理能力。近期&#xff0c;國內人工智能公司MiniMax重磅開源了其…

excel 列單元格合并(合并列相同行)

代碼 首先自定義注解CellMerge&#xff0c;用于標記哪些屬性需要合并&#xff0c;哪個是主鍵**&#xff08;這里做了一個優化&#xff0c;可以標記多個主鍵&#xff09;** import org.dromara.common.excel.core.CellMergeStrategy;import java.lang.annotation.*;/*** excel…

flowable適配達夢7 (2.1)

經過第一版的問題解決&#xff0c;后端項目可以啟動&#xff0c;前端頁面也集成進去。 前端在流程設計頁面報錯 之后發現主要是組件中modelerStore這個值沒有 解決方法:在data增加對象 給component/process/designer.vue 中涉及到的每個子組件傳入 :modelerStore“modeler…

Prometheus Exporter系列-Mysql_Exporter一鍵部署

新項目舊項目都需要給研發配置mysql監控&#xff0c;這里mysql監控對應aws 阿里云 騰訊云 華為云的云mysql產品或開源自建mysql。 exporter安裝雖然簡單&#xff0c;經常手動操作不免讓人心煩&#xff0c;一鍵完成省去繁瑣的常規操作。 配置信息對的情況下測試多次都可以正常安…

2025年移動端開發性能優化實踐與趨勢分析

啟動速度優化 本質&#xff1a;縮短首次可見幀渲染時間。 方法&#xff1a; iOS&#xff1a;利用Core ML本地模型輕量化部署&#xff0c;減少云端等待。Android&#xff1a;強制啟用SplashScreen API&#xff0c;通過setKeepOnScreenCondition控制動畫時長。冷啟動需將耗時操…

【MySQL篇】DEPENDENT SUBQUERY(依賴性子查詢)優化:從百秒到秒級響應的四種優化辦法

&#x1f4ab;《博主介紹》&#xff1a;?又是一天沒白過&#xff0c;我是奈斯&#xff0c;從事IT領域? &#x1f4ab;《擅長領域》&#xff1a;??擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對SQLserver、NoSQL(…