node.js事件循环是如何工作的,它如何处理多个请求?



我试图在node.js中测试一些异步代码。我的理解是,如果有一些异步操作正在进行,我们将在Node.js上处理新的请求。我用express和axios编写了一个简单的代码,如下所示:

app.get('/async', (req, res) => {
axios({
method: 'get',
url: 'http://localhost:30000/cpu',
headers: { 'fibo': '45' }
})
.then(ress => {
console.log(ress)
res.send('Async success')
})
.catch(err => {
console.log('failed')
console.log(err)
res.send('failed')
})
})
app.get('/', (req, res) => {
axios({
method: 'get',
url: 'http://localhost:30000/'
}).then(function (response) {
res.send('Hello World')
}).catch((err) => {
res.send('Something wrong happened')
})
})

向http://localhost:30000/cpu发出请求大约需要15秒才能完成。因此,当我们为该服务器向/async发出请求时,它将反过来向'http://localhost:30000/cpu'发出请求,这将花费一些时间。一旦我们得到响应,我的服务器将返回一个消息'Async success'

我向'/async'发出请求,并立即向'/'发出另一个请求。我的期望是,当'/async'仍在进行时,node.js将在同时处理'/'路由并立即发送响应。但我观察到'/'只有在'/async'返回后才返回,即。'/async'路由阻塞了整个服务器。

有人能解释为什么'/'正在等待'/async'完成,我该如何解决这个问题?

您的/async路由处理程序没有阻塞服务器。

但是,你的两个路由都试图联系同一个http://localhost:30000主机,所以它显然没有从/返回响应,直到/cpu完成。

如果你用res.send("done")代替/的第二条路线,你应该会看到它在/cpu路线之前完成。

实际上,两个axios()调用是并行运行的,您将按照axios()调用完成的顺序看到结果。因此,哪个请求首先完成将与哪个axios()调用首先完成有关。

并且,如果http://localhost:30000是同一台服务器,那么运行这两个请求处理程序的代码也会考虑到这个等式,因为它们都将竞争相同的cpu。

相关内容

  • 没有找到相关文章

最新更新