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

所以 Nio 为什么快?

  •  
  •   LeeReamond · 159 天前 · 5216 次点击
    这是一个创建于 159 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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

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