回答

3

非阻塞操作是基於兩種方法:

  • 通過返回無數據(如果沒有可用的數據 - 在這種情況下,調用者必須通過自身「回來」和「讀」了)
  • 使用回調。在這種情況下,「阻塞」意味着您等待某個操作達到某個特定狀態 - 而「非阻塞」意味着您觸發該操作 - 並且達到該狀態時,您通知

請注意:兩個選項都是而不是暗示併發性或客戶端上的多個線程。您絕對可以使用單個進程來實現這樣的系統(例如,想想coroutinesnode.js)。

在這個意義上:一非阻塞操作總是異步 - 因爲你不知道什麼時候就會有你的結果 - 或者什麼時候會叫你回來。兩個概念可以使用併發實現,但絕對需要這樣做。

+0

這不太正確。如果您嘗試從非阻塞套接字讀取數據,則不會收到任何迴應,而且您也不會收到回覆 - 稍後數據可用時您將不得不再次讀取數據。 –

+1

你是對的 - 在嚴格的「套接字」意義上,沒有回調。我重新寫了;希望現在更清楚。 – GhostCat

+0

「理論上講,您可以使用單個進程來實現這樣的系統」,但不僅僅是理論上的:例如,這是Node.js如何工作的基礎。 – Thomas

1

非阻塞和併發不適用於單線程程序,因爲它們指的是管理多線程的方式。非阻塞意味着程序不會在繼續前等待所有線程完成,並且只有在有多個線程進行計算時纔會發生併發計算。 (有人請糾正我,如果我錯了)。

異步是唯一的術語,適用於單線程編程,以人類輸入的形式,與其他程序的通信等。因此,不,他們不在單線程程序的背景下並不意味着彼此。

+3

我在我的單線程程序中始終使用非阻塞套接字。非阻塞僅僅意味着各種函數調用(send(),recv()等)被保證總是立即返回,而不是等待一段延長的時間(例如等待一些數據已被髮送或接收) –

+0

請隨時查看我在閱讀該問題時給出的答案;-) – GhostCat