V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ojh
V2EX  ›  问与答

关于 Non-Blocking 的终极一问

  •  
  •   ojh · 2022-06-30 10:11:01 +08:00 · 997 次点击
    这是一个创建于 663 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. 调用涉及 IO 任务的线程没有被阻塞
    2. 调用涉及 IO 任务的线程没有被阻塞,IO 任务底层是新开线程来等待 IO ,即实际有线程被阻塞
    3. 调用涉及 IO 任务的线程没有被阻塞,IO 任务底层是基于 Eventloop ,实际最多一条线程被阻塞

    上述三种情况哪种才叫 Non-Blocking ?

    因为我看了很多文档,不同的文档在上面三种不同的场景都用到了 Non-Blocking ,让我很疑惑 比如 https://projectreactor.io/docs/core/release/reference/#_blocking_can_be_wastefulSo the parallelization approach is not a silver bullet 这句话就跟 reactor-core 没有基于 NIO ( Eventloop )这个矛盾了,然后它又说自己是 Non-Blocking 又比如 https://github.com/ReactiveX/RxJava/issues/5260 ,这里说 RxJava 不是实际的 Non-Blocking

    请大佬解答一下上述三种情况哪种才叫 Non-Blocking ?这个问题

    6 条回复    2022-06-30 19:33:51 +08:00
    misaka19000
        2
    misaka19000  
       2022-06-30 10:25:00 +08:00
    非阻塞,指的就是线程或者协程等,这样的一个逻辑流,不会被卡在某些操作上面
    ojh
        3
    ojh  
    OP
       2022-06-30 10:52:46 +08:00
    @misaka19000 根据你的文章的意思,SocketChannel#configureBlocking 设置为 false 就是非阻塞了,整体来说就是上面指的第 3 种。
    ojh
        4
    ojh  
    OP
       2022-06-30 11:18:19 +08:00
    @misaka19000 "因为多路复用器所在的线程可能会阻塞,所以我们一般会把这些连接的读写操作放到新的线程中。",问一下为什么你这里说时间轮询线程会阻塞,读写事件准备了轮询线程去执行读写操作(非阻塞 IO ),依我看来只有没有事件的时候轮询线程才阻塞,没必要放到新的线程中去进行读写操作
    mmdsun
        6
    mmdsun  
       2022-06-30 19:33:51 +08:00 via iPhone
    @mmdsun 我收藏的两篇文章,希望可以帮到你理解。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3547 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:46 · PVG 08:46 · LAX 17:46 · JFK 20:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.