2011-09-13 191 views
8

這是一個術語,當我提到實時處理語言時,我會一次又一次地看到它。在這個特殊情況下,我正在閱讀node.js主頁,它有這樣的引用:什麼是阻塞功能?

「在其他系統中始終存在阻止調用來啓動事件循環。」

什麼是阻塞呼叫?

回答

13

停止腳本執行直到它結束的函數。

例如,如果我在我的語言中的函數,用於寫入文件,像這樣:

fwrite(file, "Contents"); 
print("Wrote to file!"); 

一旦該文件已被寫入到磁盤的print聲明只會被執行。整個程序是停止在這條指令。這是不顯着足夠小寫,但是想象一下我有一個巨大的BLOB寫入文件,一個花了很多秒:

fwrite(file, blob); 
print("Wrote to file!"); 

print聲明只,書寫幾秒鐘後執行,整個程序將在那段時間停止。在Node.js中,這個東西異步完成,使用事件回調。我們的例子將成爲:

fwrite(file, blob, function() { 
    print("Wrote to file!"); 
}); 
print("Do other stuff"); 

當第三個參數是一個函數,一旦該文件已被寫入到被調用。位於寫入函數之後的print語句將在之後立即調用,無論文件是否已被寫入。因此,如果我們寫一個足夠龐大的BLOB,輸出可能是這樣的:

Do other stuff 
Wrote to file! 

這使得applictions非常快速,因爲你不是在客戶端消息,文件寫或其他等待。您可以繼續以並行方式處理數據。這被Node.js的許多優點所考慮。

2
var block = function _block() { 
    while(true) { 
    readInputs(); 
    compute(); 
    drawToScreen(); 
    } 
} 

阻塞函數基本上是永久計算的。這就是阻止的意思。

其他攔截功能會等待IO發生

非阻塞IO系統是指一個函數開始一個IO動作,然後進入空閒狀態,然後處理IO操作的結果,當它發生。

它基本上是線程閒置和睡眠之間的區別。

0

阻塞調用是一種不允許處理繼續進行直到它返回到調用線程 - 這也稱爲同步調用。異步另一方面意味着線程(和代碼)可以同時執行(併發)。