我有这个文件名为index.js
:
const express = require('express')
const app = express()
const port = 3000
app.get('/home', (req, res) => {
res.send('Hello World!')
})
app.get('/route1', (req, res) => {
var num = 0;
for(var i=0; i<1000000; i++) {
num = num+1;
console.log(num);
}
res.send('This is Route1 '+ num)
})
app.listen(port, () => console.log(`Example app listening on port ${port}!`))
我首先调用端点/route1
然后立即到达终点/home
. The /route1
has for loop
并需要一些时间才能完成然后/home
运行并完成。我的问题是当应用程序忙于处理时/route1
,请求如何/home
处理了,给定的 Node js 是单线程的?
传入的请求将在 NodeJS 事件队列中排队,直到 NodeJS 有机会处理下一个事件(当长时间运行的事件处理程序完成时)。
由于nodejs是一个事件驱动的系统,它从事件队列中获取一个事件,运行该事件的回调直到完成,然后获取下一个事件,运行它直到完成,依此类推。 Nodejs 的内部将等待运行的事物添加到事件队列中,以便它们排队等待事件循环的下一个周期。
根据nodejs如何进行网络的内部结构,传入的请求可能会在操作系统中排队一段时间,然后移动到事件队列,直到nodejs有机会服务该事件。
我的问题是,当应用程序忙于处理 /route1 时,鉴于 Node js 是单线程的,如何处理对 /home 的请求?
请记住,node.js 将您的 Javascript 作为单线程运行(尽管我们现在有工作线程 https://nodejs.org/api/worker_threads.html如果你愿意的话),但它确实在内部使用线程来管理文件 I/O 和其他一些类型的异步操作等。不过,它不需要用于网络的线程。这是通过操作系统的实际异步接口进行管理的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)