簡體   English   中英

NodeJS/Express 如何同時處理多個 CPU 綁定請求

[英]How does NodeJS/Express handle multiple CPU bound requests at the same time

const run = ()=> {
console.log("Begin")
for(var i=0;i<10000000000;i++){
}
console.log("End")
}
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
 run()
 res.send('Hello World!')
})
app.listen(port, () => {
 console.log(`Example app listening at http://localhost:${port}`)
})

這是一個最小的節點應用程序,在每個請求上,它都會調用循環(5-10 秒)並返回響應。 我嘗試了兩次,幾乎同時,到達第二個的請求必須等待第一個完全完成。

from flask import Flask
def run():
    print("Begin")
    for i in range(1000000000):
        pass
    print("End")
app = Flask(__name__)
@app.route('/')
def hello_world():
    run()
    return 'Hello, World!'
if __name__ == '__main__':
    app.run()

這是一個最小的 flask 應用程序,它執行相同的操作,該方法大約需要 10 秒,但是當我點擊 API 兩次時,“開始”被打印了兩次(2 線程)。

我確信我在我的 Node 應用程序中遺漏了一些東西,這使我無法為每個請求提供自己的線程,因為涉及 CPU 綁定操作。 我知道 NodeJS 在單線程事件循環上運行,但我確信當它服務多個請求時,應該涉及一些線程。 我錯過了什么?

它不會同時處理多個同步的 CPU 綁定任務。 單個線程的含義正是它聽起來的樣子。 如果您有一段代碼正在執行,則在它完成或通過執行某種異步調用讓給另一段代碼之前,不會執行其他代碼。 有關更多詳細信息,有很多關於該主題的文章。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop

Node.js雖然是單線程,但也提供了多個forms處理CPU綁定任務。

首先,您可以為您的服務器創建一個進程集群,這聽起來可能很復雜,但大部分工作已經為您完成,因為進程之間的通信甚至請求分發給子進程來處理。 您還可以將特定任務與多個工作線程一起划分。 這實際上取決於您要解決的問題,兩種方法都有自己的優點和缺點。

暫無
暫無

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

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