nio的SocketChannel.configureBlocking(false)和aio有什么区别吗?

2013-07-26 20:55:01 +08:00
 pythonee
又来IO问题了,这个问题我想只有v2ex的大牛们能帮我了

我想问的是SocketChannel.configureBlocking(false)之后,对IO操作有什么影响,为什么nio有时候叫异步阻塞有时候又叫同步非阻塞,和aio有什么区别?

另外就是为什么configureBlocking(false)只有在nio时候才用,如果这能提高性能,为什么BIO不也用呢?而且这句话对nio的意义特别大呢?

难道我真的要去读源码吗?
7199 次点击
所在节点    问与答
6 条回复
timonwong
2013-07-26 21:10:45 +08:00
SocketChannel.configureBlocking(false)
在该socket上的读写都不阻塞,也就是读写操作立即返回,无论有没有数据。这个设置对于POSIX中的O_NONBLOCK标志。

AIO(Asynchronous IO)概念上比NIO更一步,它一般包含了Non-blocking的意思,另外还能让操作并发(concurrent)的执行。
pythonee
2013-07-26 21:29:18 +08:00
@timonwong 为什么这个操作对nio特别有用,但是BIO有没有这个设置呢
timonwong
2013-07-26 21:35:02 +08:00
@pythonee
BIO是Blocking IO。。。
NIO是Non-blocking IO。。。
先决条件啊。。
pythonee
2013-07-27 10:01:01 +08:00
@timonwong 但是nio你不设置这个标志的,默认是blocking的,我是想说为啥要分成两个,不设置不就好了,难道说是为了兼容老代码?
wang2191195
2013-07-27 10:09:56 +08:00
@pythonee 不懂java 但是non-blocking 和 AsyncIO是有区别的 non-blocking 意指不阻塞 不管有没有我否马上返回
Async意指异步 即利用内核线程(阻塞?)完成IO操作 用户代码继续执行 并等待完成事件
timonwong
2013-07-27 10:20:15 +08:00
@pythonee
"但是nio你不设置这个标志的,默认是blocking的"
1. socket默认就是blocking的,就该是blocking的(你可以想想文件操作的read(), write()默认不阻塞的情况)
2. configureBlocking(false); 之后,就成为了 non blocking *socket* io, 注意有socket.
3. SocketChannel是比较底层的东西,跟socket编程基本都对应,如果不对应,那不是多加一个概念。。。 如果按照你说的,有两种方法:
___1:继承出几种类,为了那仅仅一行代码,贯彻封+装原则。
___2: 传给其它操作,implicitly 修(po)改(huai) socket属性。

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

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

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

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

© 2021 V2EX