java – 与单生成器模式相比,lmax disruptor在多生成器模式下太慢

以前,当我使用单一生产者模式的破坏者时,例如

 new Disruptor<ValueEvent>(ValueEvent.EVENT_FACTORY,
        2048, moranContext.getThreadPoolExecutor(), ProducerType.Single,
        new BlockingWaitStrategy())

表现很好.现在我处于多线程写入单个环形缓冲区的情况.我发现ProducerType.Multi使代码比单个生产者模式慢几倍.那种糟糕的表现不会被我接受.因此,当多个线程使用锁调用相同的事件发布方法时,我应该使用单生成器模式吗?谢谢.

最佳答案 恕我直言,由带有锁的多线程访问的单个生产者将无法解决您的问题,因为它只是将锁定从破坏者端转移到您自己的程序.

您的问题的解决方案因您需要的事件模型类型而异.即你需要按时间顺序消耗事件吗?合并;或任何特殊要求.由于你正在与破坏者和多生产者打交道,这听起来非常像外汇交易系统:-)无论如何,根据我的经验,假设你需要每个生产者的时间顺序,但不关心生产者之间的混合事件,我会建议你做一个队列合并线程.结构是

>每个生产者生成数据并将它们放入自己的命名队列中
>工作线程不断检查队列.对于每个队列,它会删除一个或多个项目并将其放入单个生产者干扰器的单个生产者.

请注意,在上面的场景中,

>每个生产者队列都是单个生产者单个使用者队列.
>破坏者是一个单一的生产者多消费者破坏者.
>取决于你的需要,避免一个永远运行的线程,如果线程检查,比方说,100次运行并且所有队列都是空的,它可以设置一些变量并转到wait(),并且事件生产者可以在看到时产生()它它正在等待.

我认为这可以解决你的问题.如果没有,请发布您对事件处理模式的需求,让我们看看.

点赞