[英]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.