一种替代的多生产者方法

最近在InfoQ上,Aliasei Papou发表了一篇关于他的一些实验的文章 ,该实验在线程之间进行了高性能的消息交换。 本文中有许多示例,但我将重点介绍多生产者案例。 文章显示的一种优化方法是,如果您知道初始化时拥有的生产者数量,则可以构建一个可以大大减少竞争的结构。 现有的MultiProducerSequencer不具有此约束,这对于大量用例而言是必不可少的。 但是,我想看看如果将这种方法应用于Disruptor,我们可以实现什么。

我要使用的设计是,不是使用MultiProducerSequencer使用单个Disruptor,而是使用每个生产者使用SingleProducerSequencer的每个Disruptor。 为了使所有事件通道进入单个EventHandler,我将需要实现一个自定义EventProcessor,它具有轮询多个SequenceBarrier / DataProvider的能力。 在性能测试的com.lmax.disruptor.support程序包中可以看到此自定义MultiBufferBatchEventProcesor 。 该类的关键组件是主循环,可以在这里看到:

while (true)
{try{for (int i = 0; i < barrierLength; i++){long available = barriers[i].waitFor(-1);Sequence sequence = sequences[i];long previous = sequence.get();for (long l = previous + 1; l <= available; l++){handler.onEvent(providers[i].get(l), l, previous == available);}sequence.set(available);count += (available - previous);}Thread.yield();}// Lines omitted...
}

这种方法的核心是事件处理器将2个数组传递到其构造函数中:

  • 数据提供者[]; 环形缓冲区数组,用于从中读取数据。
  • SequenceBarrier []; 每个环形缓冲区提供的屏障。

由此事件处理器将构造一个Sequence数组,该数组将用于跟踪来自每个环形缓冲区的已处理事件。 事件循环将遍历序列屏障,以确定是否有任何环形缓冲区具有可读取的数据。 任何可用的数据都将传递到用户提供的事件处理程序上。

为了测试这一点,我创建了ThreeToThreeSequencedThroughputTest ,该测试启动了三个生产者和一个消费者。 InfoQ文章中提供的代码的方面之一是,每列火车的容量为三长,而“运”则以一长的运动量度。 为了使测试更具可比性,我在环形缓冲区中使用了一个由三个long组成的数组作为条目,并将线程之间移动的事件总数乘以3,以计算出总的“ ops”。

测试结果(英特尔®酷睿™i7-3770 CPU @ 3.40GHz)

干扰者:

Run 0, Disruptor=390,738,060 ops/sec
Run 1, Disruptor=387,931,034 ops/sec
Run 2, Disruptor=397,058,823 ops/sec
Run 3, Disruptor=394,160,583 ops/sec
Run 4, Disruptor=396,767,083 ops/sec
Run 5, Disruptor=394,736,842 ops/sec
Run 6, Disruptor=396,767,083 ops/sec

铁路/火车:

ops/sec       = 243,141,801
ops/sec       = 302,695,445
ops/sec       = 283,096,862
ops/sec       = 273,670,298
ops/sec       = 268,340,387
ops/sec       = 264,802,500
ops/sec       = 262,258,028

显然,这种方法有一些优点。 我正在考虑将此添加到主要Disruptor发行版中。 但是,我仍然需要先解决几个设计问题。

传递给处理程序的序列值是来自源环形缓冲区的值,并且可能随着事件的流逝而上升和下降,我不确定这是否会对用户造成问题。 感觉这是一件相当次要的事情,所以希望我不必担心。 事件处理器目前仅支持yield。 我需要弄清楚如何正确地包含等待策略,因为阻塞等待策略和消费者唤醒会带来一些麻烦。

这个想法是我们在邮件列表上提到的,我最初并不特别感兴趣,但是鉴于这种方法有明显的好处,我想我会更认真地对待这个想法。

参考:来自Bad Concurrency博客的JCG合作伙伴 Michael Barker 的替代性多生产者方法 。

翻译自: https://www.javacodegeeks.com/2013/12/an-alternative-multi-producer-approach.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven连接国内仓库

<mirrors> <!-- 阿里云仓库 --> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.c…

python知识点汇总_Python知识点总结大全(一)

python逻辑运算符 1.成员 and or not 优先级&#xff1a;() > not > and > or 2.and 逻辑运算符and&#xff0c;a andb&#xff0c;如果a和b都为True&#xff0c;则返回True&#xff0c;如果其中一个为False&#xff0c;返回False&#xff0c;简言之&#xff1a;一假则…

JS ES6中的箭头函数(Arrow Functions)使用

转载这篇ES6的箭头函数方便自己查阅。 ES6可以使用“箭头”&#xff08;>&#xff09;定义函数&#xff0c;注意是函数&#xff0c;不要使用这种方式定义类&#xff08;构造器&#xff09;。 一、语法 基础语法 (参数1, 参数2, …, 参数N) > { 函数声明 }(参数1, 参数…

php中trim的用法和例子,PHP ltrim()用法及代码示例

ltrim()函数是PHP中的内置函数&#xff0c;可从字符串左侧删除空格或其他字符(如果指定)。用法:ltrim( $string, $charlist )参数&#xff1a;函数ltrim()接受两个参数&#xff0c;如上面的语法所示。在这两个参数中&#xff0c;一个是必需的&#xff0c;另一个是可选的。下面将…

python怎样编写定时程序_Python如何实现定时器功能

Timer: 隔一定时间调用一个函数,如果想实现每隔一段时间就调用一个函数的话&#xff0c;就要在Timer调用的函数中&#xff0c;再次设置Timer。Timer是Thread的一个派生类 python中的线程提供了java线程功能的子集。 #!/usr/bin/env python from threading import Timer import …

应用ForkJoin –从最佳到快速

到目前为止&#xff0c;JDK 7已很好地掌握在开发人员手中&#xff0c;并且大多数人都听说过ForkJoin&#xff0c;但是没有多少人有时间或机会去尝试它。 它引起了&#xff0c;并且可能仍然引起一些混乱&#xff0c;与普通线程池有什么不同。 [1] 我在本文中的目标是通过一个代…

Echarts-K线图提示框改头换面

工作&#xff1a; 使用Hbuilder建web工程&#xff0c;加入echarts相关库&#xff0c;根据需要更改K线图及其的提示样式&#xff0c;去除默认提示&#xff0c;使用异步加载echarts的数据&#xff0c;数据格式为json。 需要注意的K线图和5日均线&#xff0c;10日均线的意义&#…

JS对url进行编码和解码(三种方式区别)

Javascript语言用于编码的函数&#xff0c;一共有三个&#xff0c;最古老的一个就是escape()。虽然这个函数现在已经不提倡使用了&#xff0c;但是由于历史原因&#xff0c;很多地方还在使用它&#xff0c;所以有必要先从它讲起。 escape 和 unescape 实际上&#xff0c;esca…

elasticsearch启动错误解决

es启动默认不能使用root用户&#xff0c;所以需要新创建一个用户来启动。 启动时可能出现的问题: [1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] [2]: max number of threads [1024] for user [esuser1] is too low, …

vc6.0 matlab混合编程,matlab2010 + vc6.0混合编程实例(调用dll)

不想解释太多直接上代码吧&#xff01;&#xff01;&#xff01;在对matlab配置后&#xff0c;上代码mcc -W cpplib:libMyAdd -T link:lib MyAdd -C就可以了&#xff0c;记得加上-C在对VC6.0进行配置的时候只要把 matlabroot\extern\include和matlabroot\extern\lib\win32\micr…

canvas换图时候会闪烁_Canvas实现图片上标注、缩放、移动和保存历史状态,纯干货(附CSS 3变化公式)...

(给前端大学加星标&#xff0c;提升前端技能.)作者&#xff1a;zhcxk1998https://juejin.im/user/5d4304bdf265da03d15531dc哈哈哈俺又来啦&#xff0c;这次带来的是canvas实现一些画布功能的文章&#xff0c;希望大家喜欢&#xff01;这个css3变化公式可以适用于平常我们使用的…

Azure DevOps Server (TFS)中代码文件换行问题解决方案(Git)

之前写过一篇博客“探索TFS Git 库文件换行&#xff08;CRLF&#xff09;的处理方式”&#xff0c;主要是针对TFVC代码库的。下面这篇文章说明如何在TFS的Git库中处理代码换行的问题。概述在Azure DevOps Server&#xff08;之前叫TFS&#xff09; 中使用Git管理源代码&#xf…

RMI强制Full GC每小时运行一次

在我职业生涯中进行的所有故障排除练习中&#xff0c;我感到随着时间的推移&#xff0c;我所追寻的错误在不断发展&#xff0c;变得越来越卑鄙和丑陋。 也许仅仅是我的年龄开始了。这个特别的Heisenbug –看起来像这篇帖子一样&#xff0c;再次让我清醒了很多&#xff0c;而不是…

apache配置-html碎片shtml格式

修改SSI 文件 conf–httpd.conf <Directory "D:/Android/Apache2.2/htdocs"> //修改文件目录 # # Possible values for the Options directive are "None", "All", # or any combination of: # Indexes Includes FollowSymLinks SymL…

php+条件限定符,const 限定符

const 限定符const 对象一旦创建后不可改变,所以const必须初始化.const int iget_size(); //运行时初始化const int j43;const int k; //错误,必须初始化默认状态下,const对象仅在文件中有效,解决办法是对于const变量不管是声明还说定义都添加extern关键字extern const int buf…

git删除远程分支文件,不改变本地文件

git提交项目时候踩的Git的坑 特别 由于准备春招&#xff0c;所以希望各位看客方便的话&#xff0c;能去github上面帮我Star一下项目https://github.com/Draymonders/Campus-Shop 经历 由于刚开始没有设置.gitignore文件&#xff0c;导致项目中所有的文件都被提交到了github上面…

python列表字符串转数字_python 将列表中的字符串转为数字

本文实例讲述了Python中列表元素转为数字的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 有一个数字字符的列表&#xff1a; numbers [‘1‘, ‘5‘, ‘10‘, ‘8‘] 想要把每个元素转换为数字&#xff1a; numbers [1, 5, 10, 8] 用一个循环来解决&#xff…

Spring的@Primary注释在起作用

Spring是一个永不止息的框架。 这是因为它提供了许多不同的解决方案&#xff0c;使我们&#xff08;开发人员&#xff09;无需编写数百万行代码即可完成我们的任务。 取而代之的是&#xff0c;我们能够以更具可读性&#xff0c;更标准化的方式进行操作。 在这篇文章中&#xff…

JS对全角与半角的验证,相互转化以及介绍

1.什么是全角和半角? 全角&#xff1a;是一种电脑字符&#xff0c;是指一个全角字符占用两个标准字符(或两个半角字符)的位置。全角占两个字节。 汉字字符和规定了全角的英文字符及国标GB2312-80中的图形符号和特殊字符都是全角字符。在全角中&#xff0c;字母和数字等与汉字…

oracle 安装ora 27102,ORA-27102 解决办法

因为在32位操作系统上执行了如下的操作alter system set sga_max_size2G scopespfile;之后再重启数据库就会失败报出错误:ORA-27102Out of Memory解决的方法也很简单:新建一个文本文件 如initaaa.ora内容&#xff1a;SPFILE../product/10.2.0&#xff0f;db_1/dbs/spfileorcl.o…