第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

異步與非阻塞

異步與非阻塞

Qyouu 2019-11-04 14:38:00
異步調(diào)用和非阻塞調(diào)用有什么區(qū)別?還在阻塞和同步調(diào)用之間(請(qǐng)?zhí)峁┦纠?
查看完整描述

3 回答

?
明月笑刀無情

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊

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

例如,在經(jīng)典套接字API中,非阻塞套接字是一個(gè)簡(jiǎn)單地立即返回特殊“錯(cuò)誤塊”錯(cuò)誤消息的套接字,而阻塞套接字會(huì)被阻塞。您必須使用單獨(dú)的函數(shù),例如select或,poll以找出何時(shí)是重試的好時(shí)機(jī)。

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

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

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

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

  • 異步意味著API總是立即返回,并且已經(jīng)開始了“后臺(tái)”工作來滿足您的請(qǐng)求,因此必須有一些相關(guān)的方法來獲取結(jié)果。


查看完整回答
反對(duì) 回復(fù) 2019-11-04
?
慕桂英4014372

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊

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

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


查看完整回答
反對(duì) 回復(fù) 2019-11-04
?
神不在的星期二

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊

同步/異步是描述兩個(gè)模塊之間的關(guān)系。

阻塞/非阻塞是描述一個(gè)模塊的情況。


例如:

模塊X:“ I”。

模塊Y:“書店”。

X問Y:您有一本書名為“ c ++入門”嗎?


1)阻止:Y回答X之前,X一直在那里等待答案?,F(xiàn)在,X(一個(gè)模塊)正在阻塞。X和Y是兩個(gè)線程或兩個(gè)進(jìn)程還是一個(gè)線程或一個(gè)進(jìn)程?我們不知道。


2)非阻塞:在Y回答X之前,X只是離開那里做其他事情。X可能每?jī)煞昼娀貋硪淮?,以檢查Y是否完成工作?還是X在Y打電話給他之前不會(huì)回來?我們不知道 我們只知道X在Y完成工作之前可以做其他事情。X(一個(gè)模塊)在這里是非阻塞的。X和Y是兩個(gè)線程還是兩個(gè)進(jìn)程或一個(gè)進(jìn)程?我們不知道。但是我們確定X和Y不能是一個(gè)線程。


3)同步:在Y回答X之前,X一直在那里等待答案。這意味著X直到Y(jié)完成其工作才能繼續(xù)?,F(xiàn)在我們說:X和Y(兩個(gè)模塊)是同步的。X和Y是兩個(gè)線程或兩個(gè)進(jìn)程還是一個(gè)線程或一個(gè)進(jìn)程?我們不知道。


4)異步:在Y回答X之前,X離開那里,X可以做其他工作。X在Y打電話給他之前不會(huì)回來?,F(xiàn)在我們說:X和Y(兩個(gè)模塊)是異步的。X和Y是兩個(gè)線程還是兩個(gè)進(jìn)程或一個(gè)進(jìn)程?我們不知道。但是我們確定X和Y不能是一個(gè)線程。




請(qǐng)注意上面兩個(gè)大膽的句子。為什么2)中的粗體句子包含兩種情況,而4)中的粗體句子僅包含一種情況?這是非阻塞和異步之間區(qū)別的關(guān)鍵。


這是有關(guān)非阻塞和同步的典型示例:


// 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);

您可以看到這種設(shè)計(jì)是非阻塞的(可以說,大多數(shù)情況下,該循環(huán)都在做些廢話,但是在CPU看來,X正在運(yùn)行,這意味著X在無阻塞的情況下),而X和Y是同步的,因?yàn)閄可以在將書從Y手中拿走之前,不要繼續(xù)做任何其他事情(X不能跳出循環(huán))。

通常,在這種情況下,使X阻塞要好得多,因?yàn)榉亲枞麜?huì)在愚蠢的循環(huán)上花費(fèi)大量資源。但是此示例可以幫助您理解以下事實(shí):非阻塞并不意味著異步。


這四個(gè)詞確實(shí)容易使我們感到困惑,我們應(yīng)該記住的是,這四個(gè)詞用于建筑設(shè)計(jì)。了解如何設(shè)計(jì)好的體系結(jié)構(gòu)是區(qū)分它們的唯一方法。


例如,我們可以設(shè)計(jì)這種架構(gòu):


// 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是異步的

如果需要,您還可以用四個(gè)詞描述在X1中創(chuàng)建的那些線程。


更重要的是:什么時(shí)候使用同步而不是異步?我們什么時(shí)候使用阻塞而不是非阻塞?


為什么Nginx是非阻塞的?為什么要阻止Apache?


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


查看完整回答
反對(duì) 回復(fù) 2019-11-04
  • 3 回答
  • 0 關(guān)注
  • 380 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)