有一次,我偶然看到了 Indy 简介 文章,从那时起我就一直在思考阻塞 IO 与非阻塞 IO。
寻找一些好的文章来描述阻塞 IO 和非阻塞 IO 的优缺点以及如何在每种情况下设计应用程序以获得自然、易于理解和易于维护的代码。
想了解大局...
阻塞 IO 意味着给定线程在完全接收 IO 之前无法执行任何操作(在套接字的情况下,等待时间可能很长)。
非阻塞IO意味着IO请求立即排队并且函数返回。实际的 IO 稍后由内核处理。
对于阻塞 IO,您要么需要接受等待每个 IO 请求,要么需要为每个请求触发一个线程(这很快就会变得非常复杂)。
对于非阻塞 IO,您可以发送多个请求,但您需要记住,直到某个“稍后”点,数据才可用。检查数据是否确实到达可能是最复杂的部分。
在 99% 的应用程序中,您不需要关心 IO 阻塞。然而,有时您需要额外的性能,允许自己发起 IO 请求,然后在返回之前执行其他操作,并希望发现 IO 请求已完成。
无论如何,只是我的两便士。
编辑:要回答如何设计一个应用程序来处理阻塞 IO,同时具有良好的性能,协程可能是一个不错的选择。
优点和缺点非常明确:
阻塞 - 线性编程,更容易编码,更少控制。
非阻塞 - 并行编程,更难编码,更多控制。