ojh
V2EX  ›  问与答

关于 Non-Blocking 的终极一问

  •  
  •   ojh · Jun 30, 2022 · 1785 views
    This topic created in 1446 days ago, the information mentioned may be changed or developed.
    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 replies    2022-06-30 19:33:51 +08:00
    misaka19000
        2
    misaka19000  
       Jun 30, 2022
    非阻塞,指的就是线程或者协程等,这样的一个逻辑流,不会被卡在某些操作上面
    ojh
        3
    ojh  
    OP
       Jun 30, 2022
    @misaka19000 根据你的文章的意思,SocketChannel#configureBlocking 设置为 false 就是非阻塞了,整体来说就是上面指的第 3 种。
    ojh
        4
    ojh  
    OP
       Jun 30, 2022
    @misaka19000 "因为多路复用器所在的线程可能会阻塞,所以我们一般会把这些连接的读写操作放到新的线程中。",问一下为什么你这里说时间轮询线程会阻塞,读写事件准备了轮询线程去执行读写操作(非阻塞 IO ),依我看来只有没有事件的时候轮询线程才阻塞,没必要放到新的线程中去进行读写操作
    mmdsun
        6
    mmdsun  
       Jun 30, 2022 via iPhone
    @mmdsun 我收藏的两篇文章,希望可以帮到你理解。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3254 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 13:29 · PVG 21:29 · LAX 06:29 · JFK 09:29
    ♥ Do have faith in what you're doing.