`

Disruptor 源码分析(7) 不同消费者类型的区别

 
阅读更多
disruptor不同消费者类型的区别

EventProcessor有3个实现类

BatchEventProcessor 多线程并发执行,不同线程执行不同是不同的event
WorkProcessor 多线程排队领event然后再执行,不同线程执行不同是不同的event.但是多了个排队领event的过程,这个是为了减少对生产者队列查询的压力吧.
NoOpEventProcessor 这个不出来任何事情 我们就不管他了.


WorkProcessor的run方法中有这一段

  do
                    {
                        nextSequence = workSequence.get() + 1L;
                        sequence.set(nextSequence - 1L);
                    }
                    while (!workSequence.compareAndSet(nextSequence - 1L, nextSequence));

可以看到先要获取workSequence,看看workSequence的来源:
在WorkerPool的构造方法中:


for (int i = 0; i < numWorkers; i++)
        {
            workProcessors[i] = new WorkProcessor<T>(ringBuffer,
                                                     sequenceBarrier,
                                                     workHandlers[i],
                                                     exceptionHandler,
                                                     workSequence);
        }


可以看到不同的workProcessors使用的是相同的workSequence.所以要先排一次队.
WorkerPool的start方法中有

 public RingBuffer<T> start(final Executor executor)
        for (WorkProcessor<?> processor : workProcessors)
        {
            executor.execute(processor);

可以看到是多线程的,而且是每一个WorkHandler一个线程.
感觉这里的WorkHandler和EventHandler没区别,都有onEvent方法,只是EventHandler的onEvent多了个sequence.


BatchEventProcessor和前面的WorkProcessor大部分相同,不同的地方是:
1 处理的是EventHandler,后面执行的时候也是一个EventHandler一个线程
2 少了排队取任务的过程,所以线程是并行的.这样多个线程都会同时去检查生产者的位置信息,竞争压力会更大一点.


1
5
分享到:
评论
1 楼 heipacker 2014-01-05  
"BatchEventProcessor 多线程并发执行,不同线程执行不同是不同的event"这句话楼主你确定?
感觉楼主还要好好研究下这个EventProcessor

相关推荐

    disruptor 多个消费者

    与传统的队列不同,Disruptor的环形缓冲区允许多个生产者和消费者并发操作,避免了锁竞争,从而实现了更高的性能。 1. **多消费者机制**:在Disruptor中,可以注册多个消费者监听事件。每个消费者都有一个独立的...

    LMAX disruptor jar包+Demo+Api+src源码 disruptor-3.0.1.jar

    - **Sequencer**:负责为生产者和消费者分配唯一的序列号,确保数据的有序性和一致性。 - **Producers**:生产者将消息放入Ring Buffer,遵循特定的策略(如使用_claim_操作)来避免冲突。 - **Consumers**:消费...

    disruptor-3.2.1源码带jar包20140321

    首先,创建生产者和消费者,然后配置Disruptor实例,设置事件处理器链。运行示例,观察Disruptor如何在多线程环境中高效地处理事件。这不仅加深了你对Disruptor的理解,还能够帮助你在实际项目中更好地应用这个框架...

    disruptor 代码分析

    本文将深入分析Disruptor的代码,特别聚焦于`setGatingSequences`方法的作用以及如何确定每个消费者可处理的最大事件序号,同时探讨`YieldingWaitStrategy`与`SingleThreadedClaimStrategy`的组合使用。 #### ...

    disruptor-3.4.4.jar disruptor 3.4.4 jar 官方github下载

    disruptor-3.4.4.jar 官方github下载 亲测可用,大家赶紧下载吧 后续再补充其他常用jar(但不好下载的)

    Disruptor并发框架中文参考文档

    **Disruptor** 的核心在于它的Ring Buffer设计,这是一种特殊的循环数组结构,能够高效地支持多个生产者向其中添加数据以及多个消费者从中读取数据的过程,而无需使用传统的锁机制。下面将详细介绍Disruptor的工作...

    disruptor-3.3.7-API文档-中英对照版.zip

    赠送jar包:disruptor-3.3.7.jar 赠送原API文档:disruptor-3.3.7-javadoc.jar 赠送源代码:disruptor-3.3.7-sources.jar 包含翻译后的API文档:disruptor-3.3.7-javadoc-API文档-中文(简体)-英语-对照版.zip ...

    Disruptor demo

    5. **多线程并行处理**:Disruptor可以配置多个消费者来处理事件,通过巧妙地调度和同步,使得多个消费者能并行地工作,而不会相互干扰。这极大地提高了系统并行处理能力。 6. **屏障(Barrier)**:在Disruptor中...

    Disruptor C++版(仅支持单生产者)

    7. 唤醒策略:Disruptor使用一种高效的唤醒机制,当消费者等待新事件时,生产者会唤醒它们,而不是让它们持续轮询,这样可以降低CPU使用率。 在使用Disruptor C++版时,你可以参考提供的示例代码来理解和实现自己的...

    Disruptor应用实例

    《Disruptor应用实例》 Disruptor是高性能并发编程领域的一个重要工具...在《DisruptorStudy》这个压缩包文件中,包含了对Disruptor的详细学习资料,包括源码分析和实践案例,帮助你更全面地掌握这一强大的并发工具。

    springboot整合Disruptor并发编程框架 #资源达人分享计划#

    Disruptor的工作原理基于环形缓冲区(Ring Buffer)的设计,它将生产者和消费者之间的数据传递过程转换为顺序写入和读取,避免了传统并发模型中的锁竞争和上下文切换,从而实现了极高的消息传递效率。在SpringBoot中...

    DisruptorDemo.zip

    7. 信号量(Barrier):在生产者和消费者之间建立同步点,确保数据的正确传递。 在"DisruptorDemo.zip"的示例代码中,我们可以看到以下关键类和方法: 1. `DisruptorDemo`:主类,创建Disruptor实例并启动事件...

    disruptor jar包+Demo+Api

    `TicketEventType.java` 可能定义了 `TicketEvent` 的各种类型,如 BUY_REQUEST, SELL_REQUEST, CANCEL_REQUEST 等,这样可以方便地识别和处理不同类型的事件。 `api` 文件可能包含的是 Disruptor 的API文档,提供...

    无锁队列Disruptor超详细教程

    Disruptor适用于多种并发场景,如单生产者多消费者并行、多生产者单消费者、多生产者多消费者竞争、多个消费者串行消费、菱形执行、链式并行执行、多组消费者相互隔离以及六边形执行顺序等。不同的场景需要结合...

    disruptor高性能Java线程间通讯库

    尽管Disruptor最初设计为支持多个生产者和单个消费者,但通过EventProcessor链,它可以实现多消费者模式。每个EventProcessor负责处理一部分事件,形成流水线化的工作方式,进一步提高了处理效率。 3. **事件...

    Java工具:高性能并发工具Disruptor简单使用

    Disruptor还引入了事件处理器链,使得多个消费者可以同时处理一个事件,进一步提升了处理效率。 使用Disruptor的步骤大致如下: 1. **创建Event**: 定义事件类,它是Disruptor中的基本数据单元,用于传递信息。 `...

    Disruptor学习.7z

    4. **屏障(Barrier)**:Disruptor使用屏障来同步生产者和消费者的进度,确保在某个屏障点之前的所有事件都被处理完毕,之后的事件才能被处理。 二、Disruptor的多线程优化 1. **无锁算法**:Disruptor通过使用...

    Disruptor学习(1)

    Disruptor-examples这个压缩包文件很可能是Disruptor的示例代码,包括了各种应用场景的实现,如简单的生产者消费者模型、多级处理链等,通过这些示例,我们可以更直观地理解Disruptor如何在实际中应用。 总的来说,...

Global site tag (gtag.js) - Google Analytics