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

本文探讨了Netty中BossGroup和WorkerGroup的作用,以及在引入业务线程池后的潜在影响。作者认为,只要避免在核心IO线程池中耗时操作,对性能影响较小,性能差异主要取决于业务处理阶段的复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 语法...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值