【问题标题】:Blocking IO vs non-blocking IO; looking for good articles [closed]阻塞 IO 与非阻塞 IO;寻找好文章[关闭]
【发布时间】:2023-10-12 08:06:01
【问题描述】:

曾几何时,我偶然看到了Introduction to Indy 的文章,从那时起就无法停止思考阻塞与非阻塞 IO。

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

【问题讨论】:

    标签: events blocking nonblocking io


    【解决方案1】:

    正面和负面非常明确:

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

    【讨论】:

      【解决方案2】:

      阻塞 IO 意味着给定线程在完全接收到 IO 之前不能再做任何事情(在套接字的情况下,这个等待可能会很长时间)。

      非阻塞 IO 意味着一个 IO 请求被立即排队并且函数返回。实际的 IO 会在稍后由内核处理。

      对于阻塞 IO,您要么需要接受要等待每个 IO 请求,要么需要为每个请求触发一个线程(这将很快变得非常复杂)。

      对于非阻塞 IO,您可以发送多个请求,但您需要记住,数据要到某个“稍后”时间点才可用。检查数据是否实际到达可能是最复杂的部分。

      在 99% 的应用程序中,您无需担心 IO 阻塞。然而,有时您需要额外的性能,允许自己发起 IO 请求,然后在返回之前执行其他操作,并希望发现 IO 请求已完成。

      不管怎样,只是我的 tuppence。

      编辑:要回答如何设计一个处理阻塞 IO 的应用程序同时具有良好的性能,coroutines 可能是一个不错的选择。

      【讨论】:

      • 表单应用程序几乎 100% 关心 IO 是否阻塞。用户不喜欢挂起的 GUI。
      • 没有什么能阻止你运行一个单独的线程来串行执行所有 IO 并阻塞......