java怎么处理耗时久的任务,netty 处理耗时任务的问题

zhaishunqi

2019-04-15 17:26:33 +08:00

@gramyang

decode 和 codec 就不说了.

两种方法个人感觉是不会有太大影响的.

Netty 的 BossGroup 和 WorkerGroup 主要用来保证系统的 IO 性能,就是所谓的 IO 线程池,只要不直接在这两个线程池里面进行耗时的操作,应该不会影响 netty 的 io 性能.

netty 启动的时候,配置了一个 BossGroup 和 WorkerGroup,伪代码如下:

```java

// 设置 NIO

serverBootstrap.channel(NioServerSocketChannel.class);

// 设置多线程模型

serverBootstrap.group(nettyConfig.getBossGroup(), nettyConfig.getWorkerGroup());

// 设置 handler 集合

serverBootstrap.childHandler(initializerFactory);

```

在增加 ctx 的时候,增加了业务线程池,如下:

```java

protected void initChannel(Channel arg0){

arg0.pipeline()

// 业务处理控制器

.addLast(businessGroup,new BusinessHandler());

}

按照你给的简书的那部分说明,找到对应源码:

```java

static void invokeChannelRead(final AbstractChannelHandlerContext next, Object msg) {

final Object m = next.pipeline.touch(ObjectUtil.checkNotNull(msg, "msg"), next);

EventExecutor executor = next.executor();

if (executor.inEventLoop()) {

next.invokeChannelRead(m);

} else {

executor.execute(new Runnable() {

public void run() {

next.invokeChannelRead(m);

}

});

}

}

```

`if (executor.inEventLoop()) {`这个分支在 addLast 时,增加了业务线程池以后,是会走下面的 else 的.

所以,我个人觉得,写在 handler 和 ctx 的线程池,实际上都是脱离了 netty 的核心 io 线程池的.并不会影响 netty 的 io 和并发吞吐量.

至于性能上的影响,在硬件配置相同的情况下.

写在 ctx 和写在 handler 的线程池的性能差别,主要看你在 handler 交给线程池前,做了什么耗时的操作没有.否则效果应该没差别.

PS:

回复不知道支持不支持 md 语法...

你可能感兴趣的:(java怎么处理耗时久的任务)