回答

3

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

  • 通过返回无数据(如果没有可用的数据 - 在这种情况下,调用者必须通过自身“回来”和“读”了)
  • 使用回调。在这种情况下,“阻塞”意味着您等待某个操作达到某个特定状态 - 而“非阻塞”意味着您触发该操作 - 并且达到该状态时,您通知

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

在这个意义上:一非阻塞操作总是异步 - 因为你不知道什么时候就会有你的结果 - 或者什么时候会叫你回来。两个概念可以使用并发实现,但绝对需要这样做。

+0

这不太正确。如果您尝试从非阻塞套接字读取数据,则不会收到任何回应,而且您也不会收到回复 - 稍后数据可用时您将不得不再次读取数据。 –

+1

你是对的 - 在严格的“套接字”意义上,没有回调。我重新写了;希望现在更清楚。 – GhostCat

+0

“理论上讲,您可以使用单个进程来实现这样的系统”,但不仅仅是理论上的:例如,这是Node.js如何工作的基础。 – Thomas

1

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

异步是唯一的术语,适用于单线程编程,以人类输入的形式,与其他程序的通信等。因此,不,他们不在单线程程序的背景下并不意味着彼此。

+3

我在我的单线程程序中始终使用非阻塞套接字。非阻塞仅仅意味着各种函数调用(send(),recv()等)被保证总是立即返回,而不是等待一段延长的时间(例如等待一些数据已被发送或接收) –

+0

请随时查看我在阅读该问题时给出的答案;-) – GhostCat