【问题标题】:Netty - Using the EventLoop to combine operations?Netty - 使用 EventLoop 来组合操作?
【发布时间】:2015-10-11 16:46:30
【问题描述】:

我遇到了this 建议通过使用底层通道的 EventLoop 来组合操作来一起执行它们。在提供的示例中,使用了写操作。我的假设是写入操作已经在 Netty 提供的 I/O 线程(EventLoop?)上异步完成......那么为什么需要使用分配给通道的 EventLoop 执行多个操作呢?

另外,如果在 EventLoop 线程上执行操作提供了某种性能优势,那么为什么它只适用于多个操作而不适用于单个操作?

任何澄清将不胜感激!谢谢。

【问题讨论】:

    标签: java multithreading netty


    【解决方案1】:

    据我了解,当您在 EventLoop 之外调用此代码时:

    channel.write(msg1);
    channel.writeAndFlush(msg3);
    

    它在引擎盖下转换为:

    channel.eventLoop().execute(new Runnable() {
      @Override
      public void run() {
        channel.write(msg1);
      }
    });
    channel.eventLoop().execute(new Runnable() {
      @Override
      public void run() {
        channel.writeAndFlush(msg3);
      }
    });
    

    因此,为了减少调度开销,最好将它们合并为一个:

    channel.eventLoop().execute(new Runnable() {
      @Override
      public void run() {
        channel.write(msg1);
        channel.writeAndFlush(msg3);
      }
    });
    

    【讨论】:

    • 但是第二段代码不会和第一段代码转换成相同的东西,只是在 EventLoop 线程中执行吗?我很困惑
    • @lare96,这将是两个Runnables - eventLoops 队列中的两个不同任务消耗内存并需要调度。事件循环可以在此任务的执行之间处理另一个通道,因此客户端可以稍后接收结果
    猜你喜欢
    • 2016-12-31
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 2014-04-28
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    相关资源
    最近更新 更多