【问题标题】:Do 'asynchronous', 'non-blocking', and 'concurrent' imply one another?“异步”、“非阻塞”和“并发”是否相互暗示?
【发布时间】:2017-08-01 15:50:00
【问题描述】:

【问题讨论】:

    标签: multithreading asynchronous concurrency parallel-processing nonblocking


    【解决方案1】:

    非阻塞操作基于两种方法:

    • 通过简单地返回而不返回数据(当没有数据可用时 - 在这种情况下,调用者必须自己“返回”并再次“读取”)
    • 通过使用回调。在这种情况下,“阻塞”意味着您等待操作达到特定状态 - 而“非阻塞”意味着您触发操作 - 当达到该状态时,您会收到通知

    请注意:这两个选项都暗示客户端的并发或多线程。您绝对可以使用单个进程来实现这样的系统(例如 coroutinesnode.js)。

    从这个意义上说:非阻塞操作总是异步 - 因为你不知道它什么时候会给你结果 - 或者它什么时候会调用你背部。这两个概念都可以使用并发来实现,但绝对需要这样做。

    【讨论】:

    • 这不太对。如果您尝试从非阻塞套接字读取,您将不会收到任何消息,也不会被回调 - 当数据可用时,您必须稍后再进行读取。
    • 你是对的——在严格的“套接字”意义上,没有回调。我改写了;希望现在更清楚了。
    • “理论上,您可以使用单个进程来实现这样的系统”,但不仅仅是理论上:例如,这是 Node.js 工作方式的基础。
    • @Thomas 真是巧合,我正要改写我的回答提到 node.js ......说真的:我听说 node.js 是单线程的,但完全错过了它会是一个不错的选择这里的例子。谢谢!
    【解决方案2】:

    非阻塞和并发并不真正适用于单线程程序,因为它们指的是管理多线程的方式。非阻塞意味着程序在继续之前不会等待所有线程完成,并且只有在有多个线程进行计算时才会发生并发计算。 (如果我错了,请有人纠正我。)

    异步是唯一适用于单线程编程的术语,以人工输入、与其他程序的通信等形式。因此,不,它们在单线程程序的上下文中并不相互暗示。

    【讨论】:

    • 我一直在我的单线程程序中使用非阻塞套接字。非阻塞只是意味着各种函数调用(send()、recv() 等)保证总是立即返回,而不是可能等待很长一段时间(例如,等待直到发送或接收一些数据)
    • 请随意查看我在阅读问题时给出的答案;-)
    猜你喜欢
    • 2013-12-04
    • 2013-05-07
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    相关资源
    最近更新 更多