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

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

單線程非阻塞IO模型是如何在Node.js中工作的

單線程非阻塞IO模型是如何在Node.js中工作的

qq_遁去的一_1 2019-06-28 15:24:12
單線程非阻塞IO模型是如何在Node.js中工作的我不是Node程序員,但我感興趣的是單線程非阻塞IO模型起作用了。在我讀了這篇文章之后理解-節(jié)點(diǎn)-js-事件循環(huán)我真的很困惑。它給出了一個模型的例子:c.query(    'SELECT SLEEP(20);',    function (err, results, fields) {      if (err) {        throw err;      }      res.writeHead(200, {'Content-Type': 'text/html'});      res.end('<html><head><title>Hello</title></head><body><h1>Return from async DB query</h1></body></html>');      c.end();     });這里有個問題。當(dāng)有兩個請求A(首先)和B,因為只有一個線程,服務(wù)器端程序?qū)⑹紫忍幚碚埱驛:執(zhí)行SQL查詢,這是一個代表I/O等待的睡眠語句。程序被放置在I/O等待時,無法執(zhí)行呈現(xiàn)網(wǎng)頁后面的代碼。在等待過程中,程序會切換到請求B嗎?在我看來,由于單線程模型,無法從另一個請求切換。但是示例代碼的標(biāo)題是“除了您的代碼之外,所有東西都是并行運(yùn)行的”。(我不知道我是否誤解了代碼,因為我從未使用過Node。)在等待過程中節(jié)點(diǎn)如何切換A到B?你能解釋一下嗎單線程非阻塞IO模型以一種簡單的方式?如果你能幫我,我會很感激的。*)
查看完整描述

3 回答

?
BIG陽

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

好的,為了給出一些透視圖,讓我將node.js與Apache進(jìn)行比較。

Apache是一個多線程HTTP服務(wù)器,對于服務(wù)器接收的每個請求,它都會創(chuàng)建一個單獨(dú)的線程來處理該請求。

另一方面,Node.js是事件驅(qū)動的,從單個線程異步處理所有請求。

當(dāng)在Apache上接收到A和B時,將創(chuàng)建兩個處理請求的線程。每個單獨(dú)處理查詢,每個在服務(wù)頁面之前等待查詢結(jié)果。只有在查詢完成之前才能使用該頁面。由于服務(wù)器在收到結(jié)果之前無法執(zhí)行其余的線程,所以查詢FETCH處于阻塞狀態(tài)。

在節(jié)點(diǎn)中,C.Query是異步處理的,這意味著當(dāng)c.query為A獲取結(jié)果時,它跳到處理B的c.query,當(dāng)結(jié)果到達(dá)A時,將結(jié)果發(fā)送回調(diào),后者發(fā)送響應(yīng)。js知道在提取完成時執(zhí)行回調(diào)。

在我看來,因為它是一個單線程模型,所以無法從一個請求切換到另一個請求。

實際上,節(jié)點(diǎn)服務(wù)器一直都是這樣做的。要使開關(guān)(異步行為),您要使用的大多數(shù)函數(shù)都會有回調(diào)。

編輯

SQL查詢從MySQL圖書館。它實現(xiàn)回調(diào)樣式以及事件發(fā)射器來排隊SQL請求。它不異步執(zhí)行它們,這是由內(nèi)部利布夫提供非阻塞I/O抽象的線程:

  1. 打開到db的連接,就可以異步地建立連接本身。
  2. 連接db后,查詢將傳遞給服務(wù)器。查詢可以排隊。
  3. 主事件循環(huán)通過回調(diào)或事件得到完成通知。
  4. 主循環(huán)執(zhí)行回調(diào)/均衡器。

對http服務(wù)器的傳入請求以類似的方式處理。內(nèi)部線程體系結(jié)構(gòu)如下所示:


C+線程是執(zhí)行異步I/O(磁盤或網(wǎng)絡(luò))的libuv線程。主事件循環(huán)在將請求分派到線程池后繼續(xù)執(zhí)行。它可以接受更多的請求,因為它不等待或睡眠。SQL查詢/HTTP請求/文件系統(tǒng)讀取都是這樣發(fā)生的。


查看完整回答
反對 回復(fù) 2019-06-28
?
繁星淼淼

TA貢獻(xiàn)1775條經(jīng)驗 獲得超11個贊

Node.js使用利布夫幕后。利布夫有一個線程池(默認(rèn)情況下大小為4)。因此,node.js使用線程實現(xiàn)并發(fā)。

不過你的代碼運(yùn)行在單個線程上(也就是說,Node.js函數(shù)的所有回調(diào)都將在同一個線程上調(diào)用,即所謂的循環(huán)線程或事件循環(huán))。當(dāng)人們說“Node.js運(yùn)行在單個線程上”時,他們實際上是在說“Node.js的回調(diào)運(yùn)行在單個線程上”。


查看完整回答
反對 回復(fù) 2019-06-28
  • 3 回答
  • 0 關(guān)注
  • 871 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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