阻塞I/O与非阻塞I/O;寻找好文章

61

从前,我偶然看到了Indy介绍文章,自那时起就一直在考虑阻塞和非阻塞IO的优缺点。

寻找一些好的文章来描述阻塞IO和非阻塞IO的优缺点以及如何设计应用程序,在每种情况下获得自然、易于理解和易于维护的代码。
希望能够了解整个大局......

2个回答

78
阻塞IO意味着给定的线程在接收完IO之前无法执行任何其他操作(在套接字的情况下,等待时间可能很长)。
非阻塞IO意味着IO请求立即排队,并返回函数。实际IO稍后由内核处理。
对于阻塞IO,您需要接受要等待每个IO请求或需要为每个请求启动一个线程(这将很快变得非常复杂)。
对于非阻塞IO,您可以发送多个请求,但需要记住数据直到某个“稍后”点才可用。检查数据是否已到达可能是最复杂的部分。
在99%的应用程序中,您不需要关心IO是否阻塞。然而,有时您需要额外的性能,以便在启动IO请求后执行其他操作,然后再回来,并希望发现IO请求已完成。
无论如何,只是我的一点建议。
编辑:要回答如何设计用于处理阻塞IO并具有良好性能的应用程序,coroutines可能是一个很好的选择。

1
表单应用程序几乎100%的时间都会关注IO阻塞。用户不喜欢挂起的GUI。 - Spencer Ruport
7
你可以开启一个独立的线程,以串行和阻塞的方式执行所有IO操作,并没有任何阻碍... - Goz

39

优缺点很明显:

阻塞 - 线性编程,编码更容易,控制更少。
非阻塞 - 并行编程,编码更困难,控制更多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接