gpt4 book ai didi

disruptor-pattern - Disruptor——消费者是多线程的吗?

转载 作者:行者123 更新时间:2023-12-02 22:00:33 30 4
gpt4 key购买 nike

我有以下关于干扰器的问题:

  1. 消费者(事件处理器)没有实现他们实现的 EventHandler 的任何 Callable 或 Runnable 接口(interface),那么他们如何并行运行,例如,我有一个干扰器实现,其中有一个像这样的菱形图案
     c1P1 - c2 - c4 - c5     c3

Where c1 to c3 can work in parallel after p1, and C4 and C5 work after them.

So conventionally I'd have something like this (with P1 and C1-C5 being runnables/callables)

p1.start();
p1.join();

c1.start();
c2.start();
c3.start();
c1.join();
c2.join();
c3.join();

c4.start();
c4.join();
c5.start();
c5.join();

但是在 Disruptor 的情况下,我的事件处理程序都没有实现 Runnable 或 Callable,那么 disruptor 框架最终如何并行运行它们?

采取以下场景:

我的消费者 C2 需要对事件进行一些注释的 Web 服务调用,在 SEDA 中,我可以为这样的 10 个 C2 请求启动 10 个线程 [用于将消息从队列中拉出 + 进行 Web 服务调用并更新下一个 SEDA 队列]这将确保我不会依次等待 10 个请求中的每一个的 Web 服务响应在这种情况下,我的事件处理器 C2(如果)是单个实例,将依次等待 10 个 C2 请求。

最佳答案

您的 EventHandler 被组合成 BatchEventProcessor 的一个实例,它是一个 Runnable。

  • BatchEventProcessor 实现了 run() 循环。
  • 它负责从环形缓冲区中获取更新的事件序列号。
  • 当事件可供处理时,它会将它们传递给您的 EventHandler 进行处理。

使用 DSL 时,Disruptor 负责通过 Executor 实例创建这些线程。

  • 您在 Disruptor 构造函数中提供一个 Executor。
  • 您在 DSL 上使用 and/then/etc 提供您的事件处理程序列表。
  • 然后,调用 Disruptor start() 方法。作为 start() 方法的一部分,每个 EventProcessor(Runnable)都被提交给 Executor。
  • Executor 将依次在线程上启动您的 EventProcessor/EventHandler。

关于您的特定场景(即:长时间运行的事件处理程序),您可能会引用这个问题:

关于disruptor-pattern - Disruptor——消费者是多线程的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17019203/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com