我正在学习LMAX Disruptor,并遇到了一个问题:当我有一个非常大的环形缓冲区时,比如1024,我的生产者比我的消费者快得多,环形缓冲区将保存大量数据,但在我的应用程序结束之前不会发布事件。这意味着我的应用程序将丢失大量数据(我的应用程序不是守护进程)。
我试着放慢制作人的速度,这是有效的。但我不能在我的应用程序中使用这种方法,它会极大地降低我的应用程序的性能。
val ringBufferSize = 1024
val disruptor = new Disruptor[util.Map[String, Object]](new MessageEventFactory, ringBu
遵循关于Java中Disruptor的教程,然后进行以下调用
Disruptor<LongEvent> disruptor = new Disruptor<>(LongEvent::new, bufferSize, executor);
其中,LongEvent是使用无参数的默认构造函数实例化的。new LongEvent()。
Kotlin中的等效行正在向::new抛出一个错误。Kotlin中::new的正确语法是什么?
# THIS IS INVALID
val disruptor = Disruptor<LongEvent>(LongEvent::ne
作为PHP的新手,我看过文档之类的东西,无法找到这个问题的答案。
我想接受$_POST输入,如下所示:
Large Automated Structural Restoration 1 Hull Repair Unit Medium 50 m3
Experimental 10MN Microwarpdrive I 5 Propulsion Module Medium 50 m3
Warp Disruptor I 1 Warp Scrambler Medium 5 m3
Upgraded EM Ward Amplifier I
遵循,我已经建立了一个最小的破坏与单一生产者和单一消费者。
生产者
import com.lmax.disruptor.RingBuffer;
public class LongEventProducer
{
private final RingBuffer<LongEvent> ringBuffer;
public LongEventProducer(RingBuffer<LongEvent> ringBuffer)
{
this.ringBuffer = ringBuffer;
}
public void
我最近被介绍给LMAX Disruptor,并决定试一试。多亏了开发人员,安装过程迅速而轻松。但我想如果有人能帮我的话,我会遇到麻烦。
问题:I被告知,当生产者发布事件时,它应该阻塞,直到消费者有机会在包装之前检索它。我在消费者端设置了一个序列屏障,我可以确认,如果没有生产者发布的数据,消费者的waitFor调用将被阻塞。但是,生产者似乎没有受到任何方式的监管,只会在环形缓冲区中对未处理的数据进行包装和覆盖。
我有一个生产者作为运行对象运行在单独的线程上。
public class Producer implements Runnable {
private final RingBuf
LMAX Disruptor的示例代码“开始”..。
public class LongEvent
{
private long value;
public void set(long value)
{
this.value = value;
}
}
参考文献:
为什么private long value没有被声明为volatile
我之所以这样问是因为,对于Disruptor模式来说,数据是在线程之间共享的(生产者->使用者)。
我猜:在生产者和使用者线程之间已经(至少)有一个内存围栏。
以前,当我使用单生产者模式的干扰,例如。
new Disruptor<ValueEvent>(ValueEvent.EVENT_FACTORY,
2048, moranContext.getThreadPoolExecutor(), ProducerType.Single,
new BlockingWaitStrategy())
表演很好。现在,我所处的情况是,多个线程将写入单个环缓冲区。我发现,ProducerType.Multi使代码比单个生产者模式慢几倍。那种糟糕的表现我是不会接受的。那么,当多个线程使用锁调用相同的事件发布方法时,我应该使用
干扰器github地址是:
我有一个简单的测试如下:
public class DisruptorMain {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) throws Exception {
class Element {
private int value;
public int get() {
return valu
使用Disruptor ring buffer,我每秒只能获得600万次操作。我想知道我哪里错了。我的事件处理程序只是侦测一个计数器。这是单一生产者和单一消费者的情况。有没有人能告诉我我的语义本身是不是错了。该程序创建一个生产者线程,该线程添加到缓冲区中。并创建一个事件处理程序来处理发布事件。每次发布事件时,eventhandler都会递增一个易失性计数器。
public class MainClass{
public static class globalVariables
{
static int NUMBER_OF_ITERATIONS = 33554432
我以堆栈溢出问题中的代码示例为例,并将其修改为“度量”时间。完整的名单如下:
using System;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Disruptor;
using Disruptor.Dsl;
namespace DisruptorTest
{
public sealed class ValueEntry
{
public long Value { get; set; }