簡體   English   中英

NodeJS createServer httpRequest 和線程

[英]NodeJS createServer httpRequest and threads

這是一個奇怪的問題,但我對這應該如何工作缺乏任何直覺,而且很難復制:

我在 NodeJS 中有一個簡單的 Web 服務器,我在其中全局公開創建的請求:

http.createServer(function(req, res) {
    global.request = req;

    // do something... processRequest();
});

在“做某事”內部,是一個使用全球化請求的函數:

function processRequest() {
    var request = global.request;
}

global.request?任意兩個實例之間是否可能發生沖突global.request?

據我了解,每個連接使用不同的線程,集中在 C 工作池中,這意味着不可能發生沖突(除非global上下文在所述工作人員之間可用,並且這種跨線程共享似乎很困難,如果不是不可能的話),但是因為 JavaScript 是處理連接的工具,所以我暗中懷疑這種碰撞是可能發生的。

非常感謝有關如何改進此問題的任何幫助或指示。

global.request 的任意兩個實例之間是否可能發生沖突?

是的,可能會發生沖突,但global.request沒有兩個實例。 node.js 中只有一種global狀態。

據我了解,每個連接使用不同的線程,匯集在 C 工作池中

這是不正確的。 Node.js Javascript 是單線程的,所有請求一次運行一個(或有時交錯運行),但只在單個線程上運行。 node.js 不使用單獨的線程進行 TCP 連接。 一個線程用於所有網絡。 有一個 C++ 線程池用於一些磁盤 I/O 操作,但 Javascript 方面仍然是單線程的。 I/O 線程僅用於實現通過 Javascript 呈現的異步行為。 這些 I/O 線程與網絡實現無關,但可能是您理解混亂的一部分。

在 node.js 中,多個請求可以同時“進行中”。 這意味着請求可以訪問的任何數據都需要注意這一點。

數據可以在全局可訪問變量中的請求之間共享,但您不能將特定於請求的數據存儲在全局中,因為其他請求可能會擊敗它。

Node.js Javascript 是單線程的,這意味着給定的請求在運行時不會被搶先中斷,這大大簡化了事情,但是一旦請求開始異步操作,然后完成它的當前執行線程(等待調用異步回調),然后其他請求可以運行。 因此,您可以同時處理多個請求。

像您的代碼這樣的問題的常用解決方案表明,它根本不將特定於請求的內容存儲在全局變量中。 相反,您將請求/響應參數傳遞給任何需要使用它們的函數。 您也可以在請求或響應對象本身上存儲其他類型的數據。


所以,而不是這個:

http.createServer(function(req, res) {
    global.request = req;

    // do something... processRequest();
});

function processRequest() {
    var request = global.request;
}

您必須將請求傳遞給任何需要它的函數:

http.createServer(function(req, res) {

    // do something... 
    processRequest(req);
});

function processRequest(req) {
    // operate on the request here
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM