排列5走势图首页    注册   登录
排列5走势图 = way to explore
排列5走势图 是一个排列5走势图关于 分享和探索的地方
现在注册
已注册用户请  登录
排列5走势图  ›  Java

netty 处理耗时任务的问题

  •  
  •   gramyang · 8 天前 · 743 次点击
    netty 处理任务一般在 worker 线程里,对于在 netty 中如何使用线程池来处理耗时任务排列5走势图我 觉得这篇文章说的可以: http://www.jianshu.com/p/727bbc7454dc

    但是问题来了,encode 和 decode 排列5走势图方法 算不算耗时任务?有的文章说算,有的文章说不算。排列5走势图我 认为 encode 和 decode 姑且也应该算耗时任务吧,请教一下大家的意见
    10 回复  |  直到 2019-04-16 07:34:04 +08:00
        1
    javapythongo   8 天前
    encode 算什么耗时任务。。。又不费 cpu、又没 io
        2
    loveCoding   8 天前
    不算,但是编码 /解码有很多排列5走势图优化 排列5走势图技巧 在里面.
        3
    jimrok   8 天前   ♥ 1
    netty 这种东西就是异步 IO,也就是在 decode 时,已经完成了数据的接收。decode 只是利用 cpu 做一些计算完成 byte 的转换。cpu 干这种事情是非常块的,也不需要其他子源参与。一旦排列5走势图你 做完了 decode 得到了需要的 java 对象,那可能排列5走势图你 会去做业务处理,例如数据库的查询,这里会阻塞 worker 线程,那么另外的连接就必须排队 decode,所以,要想让并发量高,排列5走势图你 需要用另外的线程池去干业务的事情,或者分发给其他的排列5走势图服务 器来做。
        4
    gramyang   8 天前
    @jimrok 顺便请教一个问题:现在有两种方式来并发处理 channelhandler,一个是用 EventExecutor ;还有一种排列5走势图方法 是用 worker 线程的 eventloop,就是 ctx.executor。第二种排列5走势图方法 会不会影响到 worker 线程组的接收请求的效率呢?
        5
    wucao219101   8 天前
    encode 和 decode 不算,没有 IO。
        6
    jimrok   7 天前
    @gramyang 排列5走势图我 对 netty 不了解的。好像两者没有差别,除非是 ctx 上的 executor 被替换了默认的实现。
        7
    gz911122   7 天前
    内存操作都不算耗时任务
    耗时任务一般指 io

    一个简单粗暴的判断标准:任何涉及到 IO 操作的代码,都可以认为是可能造成阻塞的代码,纯粹内存操作的代码,只要执行时间没有明显超长(例如执行循环几万次的处理便可认为是执行时间超长),都可以认为是非阻塞代码。
        8
    zhaishunqi   7 天前
    @gramyang
    decode 和 codec 就不说了.
    两种排列5走势图方法 个人感觉是不会有太大影响的.

    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());
    }

    按照排列5走势图你 给的简书的那部分说明,找到对应源码:
    ```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 的.

    所以,排列5走势图我 个人觉得,写在 handler 和 ctx 的线程池,实际上都是脱离了 netty 的核心 io 线程池的.并不会影响 netty 的 io 和并发吞吐量.
    至于性能上的影响,在硬件配置相同的情况下.
    写在 ctx 和写在 handler 的线程池的性能差别,主要看排列5走势图你 在 handler 交给线程池前,做了什么耗时的操作没有.否则效果应该没差别.

    PS:
    回复不知道支持不支持 md 语法...
        9
    gramyang   7 天前
    @zhaishunqi 很精准,谢谢
        10
    runningman   7 天前 via iPhone
    不知道都咋玩的 可以交流交流 目前线上没问题
    但是不知道是否还能排列5走势图优化 微信 270115861
    排列5走势图关于   ·   FAQ   ·   API   ·   排列5走势图排列5走势图我 们 的愿景   ·   广告投放   ·   感谢   ·   实用小排列5走势图工具   ·   3995 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 17ms · UTC 08:15 · PVG 16:15 · LAX 01:15 · JFK 04:15
    ♥ Do have faith in what you're doing.
    沪排列5走势图ICP 备16043287号-1