亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

異步與非阻塞

異步與非阻塞

Qyouu 2019-11-04 14:38:00
異步調用和非阻塞調用有什么區別?還在阻塞和同步調用之間(請提供示例)?
查看完整描述

3 回答

?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

在許多情況下,它們是同一事物的不同名稱,但是在某些情況下,它們是完全不同的。因此,這取決于。術語并不是在整個軟件行業中以完全一致的方式應用。

例如,在經典套接字API中,非阻塞套接字是一個簡單地立即返回特殊“錯誤塊”錯誤消息的套接字,而阻塞套接字會被阻塞。您必須使用單獨的函數,例如select或,poll以找出何時是重試的好時機。

但是,異步套接字(Windows套接字支持)或.NET中使用的異步IO模式更為方便。您調用一個方法來開始操作,框架完成后會回調您。即使在這里,也存在基本差異。異步Win32套接字通過傳遞Window消息將其結果“編組”到特定的GUI線程,而.NET異步IO是自由線程的(您不知道將在哪個線程上調用回調)。

因此,它們并不總是意味著同一件事。為了說明套接字示例,我們可以說:

  • 阻塞和同步的含義相同:調用API,它將掛起線程,直到得到某種答案并將其返回給您為止。

  • 非阻塞意味著,如果無法快速返回答案,則API會立即返回錯誤并執行其他操作。因此,必須有一些相關的方式來查詢API是否已準備好被調用(即,以一種有效的方式模擬等待,以避免在緊密循環中進行手動輪詢)。

  • 異步意味著API總是立即返回,并且已經開始了“后臺”工作來滿足您的請求,因此必須有一些相關的方法來獲取結果。


查看完整回答
反對 回復 2019-11-04
?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

  • 異步是指并行完成的事情,也就是說是另一個線程。

  • 非阻塞通常指輪詢,即檢查給定條件是否成立(套接字可讀,設備具有更多數據,等等)。


查看完整回答
反對 回復 2019-11-04
?
神不在的星期二

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?


為了做出一個好的選擇,您必須分析您的需求并測試不同體系結構的性能。沒有適合各種需求的架構。


查看完整回答
反對 回復 2019-11-04
  • 3 回答
  • 0 關注
  • 386 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號