关于 Non-Blocking 的终极一问

2022-06-30 10:11:01 +08:00
 ojh
  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 ?这个问题

1193 次点击
所在节点    问与答
6 条回复
misaka19000
2022-06-30 10:23:32 +08:00
misaka19000
2022-06-30 10:25:00 +08:00
非阻塞,指的就是线程或者协程等,这样的一个逻辑流,不会被卡在某些操作上面
ojh
2022-06-30 10:52:46 +08:00
@misaka19000 根据你的文章的意思,SocketChannel#configureBlocking 设置为 false 就是非阻塞了,整体来说就是上面指的第 3 种。
ojh
2022-06-30 11:18:19 +08:00
@misaka19000 "因为多路复用器所在的线程可能会阻塞,所以我们一般会把这些连接的读写操作放到新的线程中。",问一下为什么你这里说时间轮询线程会阻塞,读写事件准备了轮询线程去执行读写操作(非阻塞 IO ),依我看来只有没有事件的时候轮询线程才阻塞,没必要放到新的线程中去进行读写操作
mmdsun
2022-06-30 19:32:58 +08:00
mmdsun
2022-06-30 19:33:51 +08:00
@mmdsun 我收藏的两篇文章,希望可以帮到你理解。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/863117

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX