V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LeeReamond
V2EX  ›  Java

所以 Nio 为什么快?

  •  
  •   LeeReamond · 2021-12-14 02:27:26 +08:00 · 6063 次点击
    这是一个创建于 856 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我看首页那个问异步的老哥,说到最后就一句话“反正 nio 也很快,为什么需要用协程?”

    不得不感叹信息技术的发展确实经常出现这种情况,后来人学起来不了解之前发生了啥,如果不特意去追踪的话,很多东西无法理解,干脆就不理解了。我想如果他是一路跟踪异步变化过来的,比如他在 20 年前参与过 c10K 问题的讨论,或者在 10 年前参与过 C10M 的讨论,应该不会对异步本身有任何质疑。。

    不过话说回来为啥有的框架基于线程确实也可以做到很快,虽然上限比较低,但是大多数场景也堪用,我确实不太懂。

    21 条回复    2022-01-17 15:28:47 +08:00
    ferock
        1
    ferock  
       2021-12-14 06:31:00 +08:00 via iPhone
    后来人学起来不了解之前发生了啥,如果不特意去追踪的话,很多东西无法理解,干脆就不理解了。

    这句话值得探讨
    yazoox
        2
    yazoox  
       2021-12-14 07:16:27 +08:00   ❤️ 3
    @ferock
    因为要学习的东西太多,变化的东西也太多太快吧。如果没有“取舍”,什么都去刨根问底的话,对于普通人来讲,时间和精力都不够。不是人人都是超人大神......
    coolcatha
        3
    coolcatha  
       2021-12-14 07:18:48 +08:00 via iPhone   ❤️ 45
    楼上一猫一狗的深刻对话莫名可爱
    charlie21
        4
    charlie21  
       2021-12-14 07:40:01 +08:00 via iPhone   ❤️ 1
    封装是否有利于美好生活?

    正方:很多东西都是这样,“封装” 又不是 理解力的封装,鼓励你不懂而已;不透彻的就是不好;若封装质量高则不需要懂细节 若封装质量低则必须要求你懂细节

    反方:项目压力 时间成本 活儿都做不完 谁去理解它,没收获,不碍事 能用就行,用不同层面的知识去完成不同层面的任务,封装本身意义就是隐藏细节
    securityCoding
        5
    securityCoding  
       2021-12-14 09:09:27 +08:00 via Android   ❤️ 2
    那么卷干啥,也没见国外天天讲底层啊
    bigbyto
        6
    bigbyto  
       2021-12-14 09:09:29 +08:00 via iPhone   ❤️ 2
    这两者其实联系并不大,NIO 是新的 IO 提供了事件驱动使得原来的多个线程阻塞等待 IO 就绪变为一个或多个线程依赖系统内核通知。协程则是一种轻量级线程,调度切换都发生在用户空间,减少 system call ,在某些场景有一定优势。
    msg7086
        7
    msg7086  
       2021-12-14 09:55:08 +08:00
    解决一类问题的两种方法而已。
    SoloCompany
        8
    SoloCompany  
       2021-12-14 09:59:58 +08:00 via iPhone
    槽多无口
    真要和协程扯上对标的也应该是 bio 而不是 nio
    nio 是提供事件驱动实现(协程也是其中之一)可能的底层之一
    sagaxu
        9
    sagaxu  
       2021-12-14 10:11:55 +08:00 via Android
    如果一路系统性学过来,大概不会有此疑问
    Leviathann
        10
    Leviathann  
       2021-12-14 10:13:49 +08:00
    @securityCoding 国外不讲,但都是国外做的
    guyeu
        11
    guyeu  
       2021-12-14 11:05:17 +08:00
    NIO+多线程的上限应该会比 BIO+协程更高吧,用户态的协程调度开销也蛮大的。
    sujin190
        12
    sujin190  
       2021-12-14 11:34:12 +08:00
    @guyeu #11 这不就是 callback 和协程的区别么,一个手动调度一个自动调度,逻辑上也没啥区别,两者谁更快还不一定呢,毕竟业务流程复杂了 callback 写出高性能代码的更难了

    再说各位别把异步 io 和协程混在一起啊,这两个虽然配合使用,但是这两并不是一回事
    stach
        13
    stach  
       2021-12-14 11:40:51 +08:00
    所以 redis 为什么快?
    stach
        14
    stach  
       2021-12-14 11:41:25 +08:00
    所以 nginx 为什么快?
    ikas
        15
    ikas  
       2021-12-14 13:27:35 +08:00
    不谈场景没有任何意义
    Joker123456789
        16
    Joker123456789  
       2021-12-14 15:02:32 +08:00   ❤️ 6
    NIO 应该不是快,而是用较少的线程,可以实现以前较多线程的并发量,并且对资源的占用 少了很多。

    以前是一个连接一个线程,并发上来以后,线程会特别多。NIO 是 少量线程 处理 大量连接。
    以前一个连接进来后,只要数据没有传输完成,这个线程就会一直停在这,不能释放。NIO 是 用一个线程去处理所有连接,有数据进来 才会通知业务线程去处理。收到多少数据就读多少,读完就释放了。 不会一直停在这。 对资源的利用率更高。

    所以,在面对高并发的时候,NIO 更省资源,换句话说,同样的资源下,NIO 可以处理更多的并发, 这也是为什么一提到 NIO 总是说 他的并发高。

    NIO 快的说法,我还是第一次听说。
    youxiachai
        17
    youxiachai  
       2021-12-14 17:48:57 +08:00
    nio 跟协程没啥联系吧....
    monkeyWie
        18
    monkeyWie  
       2021-12-14 18:03:27 +08:00
    nio+协程就是 golang 了,热知识 go 里面所有 io 操作代码调用上看起来是阻塞的,实际上底层是异步的(不占 cpu 资源),这也是 go 为啥在网络开发上这么火的原因
    pengtdyd
        19
    pengtdyd  
       2021-12-14 18:09:18 +08:00
    大部分人应该还是以赚钱为主,研究技术注定是小部分人的狂欢
    saluton
        20
    saluton  
       2021-12-15 10:49:53 +08:00
    @coolcatha 人类不行( doge
    beitayongguo
        21
    beitayongguo  
       2022-01-17 15:28:47 +08:00
    nio 和 bio 之类的只是两种 io 模型吧... nio 不一定快的啊 要不然还要 bio 干啥。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5671 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 03:25 · PVG 11:25 · LAX 20:25 · JFK 23:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.