3 回答

TA貢獻1828條經驗 獲得超4個贊
在許多情況下,它們是同一事物的不同名稱,但是在某些情況下,它們是完全不同的。因此,這取決于。術語并不是在整個軟件行業中以完全一致的方式應用。
例如,在經典套接字API中,非阻塞套接字是一個簡單地立即返回特殊“錯誤塊”錯誤消息的套接字,而阻塞套接字會被阻塞。您必須使用單獨的函數,例如select
或,poll
以找出何時是重試的好時機。
但是,異步套接字(Windows套接字支持)或.NET中使用的異步IO模式更為方便。您調用一個方法來開始操作,框架完成后會回調您。即使在這里,也存在基本差異。異步Win32套接字通過傳遞Window消息將其結果“編組”到特定的GUI線程,而.NET異步IO是自由線程的(您不知道將在哪個線程上調用回調)。
因此,它們并不總是意味著同一件事。為了說明套接字示例,我們可以說:
阻塞和同步的含義相同:調用API,它將掛起線程,直到得到某種答案并將其返回給您為止。
非阻塞意味著,如果無法快速返回答案,則API會立即返回錯誤并執行其他操作。因此,必須有一些相關的方式來查詢API是否已準備好被調用(即,以一種有效的方式模擬等待,以避免在緊密循環中進行手動輪詢)。
異步意味著API總是立即返回,并且已經開始了“后臺”工作來滿足您的請求,因此必須有一些相關的方法來獲取結果。

TA貢獻1963條經驗 獲得超6個贊
同步/異步是描述兩個模塊之間的關系。
阻塞/非阻塞是描述一個模塊的情況。
例如:
模塊X:“ I”。
模塊Y:“書店”。
X問Y:您有一本書名為“ c ++入門”嗎?
1)阻止:Y回答X之前,X一直在那里等待答案。現在,X(一個模塊)正在阻塞。X和Y是兩個線程或兩個進程還是一個線程或一個進程?我們不知道。
2)非阻塞:在Y回答X之前,X只是離開那里做其他事情。X可能每兩分鐘回來一次,以檢查Y是否完成工作?還是X在Y打電話給他之前不會回來?我們不知道 我們只知道X在Y完成工作之前可以做其他事情。X(一個模塊)在這里是非阻塞的。X和Y是兩個線程還是兩個進程或一個進程?我們不知道。但是我們確定X和Y不能是一個線程。
3)同步:在Y回答X之前,X一直在那里等待答案。這意味著X直到Y完成其工作才能繼續?,F在我們說:X和Y(兩個模塊)是同步的。X和Y是兩個線程或兩個進程還是一個線程或一個進程?我們不知道。
4)異步:在Y回答X之前,X離開那里,X可以做其他工作。X在Y打電話給他之前不會回來?,F在我們說:X和Y(兩個模塊)是異步的。X和Y是兩個線程還是兩個進程或一個進程?我們不知道。但是我們確定X和Y不能是一個線程。
請注意上面兩個大膽的句子。為什么2)中的粗體句子包含兩種情況,而4)中的粗體句子僅包含一種情況?這是非阻塞和異步之間區別的關鍵。
這是有關非阻塞和同步的典型示例:
// thread X
while (true)
{
msg = recv(Y, NON_BLOCKING_FLAG);
if (msg is not empty)
{
break;
}
sleep(2000); // 2 sec
}
// thread Y
// prepare the book for X
send(X, book);
您可以看到這種設計是非阻塞的(可以說,大多數情況下,該循環都在做些廢話,但是在CPU看來,X正在運行,這意味著X在無阻塞的情況下),而X和Y是同步的,因為X可以在將書從Y手中拿走之前,不要繼續做任何其他事情(X不能跳出循環)。
通常,在這種情況下,使X阻塞要好得多,因為非阻塞會在愚蠢的循環上花費大量資源。但是此示例可以幫助您理解以下事實:非阻塞并不意味著異步。
這四個詞確實容易使我們感到困惑,我們應該記住的是,這四個詞用于建筑設計。了解如何設計好的體系結構是區分它們的唯一方法。
例如,我們可以設計這種架構:
// Module X = Module X1 + Module X2
// Module X1
while (true)
{
msg = recv(many_other_modules, NON_BLOCKING_FLAG);
if (msg is not null)
{
if (msg == "done")
{
break;
}
// create a thread to process msg
}
sleep(2000); // 2 sec
}
// Module X2
broadcast("I got the book from Y");
// Module Y
// prepare the book for X
send(X, book);
在這里的例子中,我們可以說
X1是非阻塞的
X1和X2是同步的
X和Y是異步的
如果需要,您還可以用四個詞描述在X1中創建的那些線程。
更重要的是:什么時候使用同步而不是異步?我們什么時候使用阻塞而不是非阻塞?
為什么Nginx是非阻塞的?為什么要阻止Apache?
為了做出一個好的選擇,您必須分析您的需求并測試不同體系結構的性能。沒有適合各種需求的架構。
- 3 回答
- 0 關注
- 386 瀏覽
添加回答
舉報