以下是以下示例:
const http = require('http')
const server = http.createServer()
const log = console.log.bind(console)
server.on('request', (req, res) => {
log('visited!')
res.writeHead(200, {
'Content-Type': 'text/html; charset=utf-8',
})
for (let i = 0; i < 100000; i++) {
res.write('<p>hello</p>')
}
res.end('ok')
})
server.listen(3000, '0.0.0.0')
&#13;
当服务器处理第一个请求时,线程被阻止,无法处理第二个请求。我想知道为什么会发生这种情况,因为nodejs使用事件驱动的非阻塞I / O模型。
答案 0 :(得分:1)
很棒的问题。
NodeJS使用非阻塞 I / O 模型;也就是说,I / O操作将在不同的线程下运行,但所有JavaScript代码都将在同一个事件循环驱动的线程上运行。
在您的示例中,当您要求HTTP服务器侦听传入请求时,Node将在引擎盖下的单独线程上管理套接字侦听操作,以便在调用server.listen()
后代码可以继续运行。 / p>
当请求到来时,您的server.on('request')
回调将在主事件循环线程上执行。如果另一个请求进入,则在第一个回调和当前在主线程上执行的任何其他代码完成之前,它的回调不能运行。
大多数情况下,回调是短暂的,所以你很少需要担心阻塞主线程。如果回调不是短暂的,它们几乎总是调用一个异步I / O相关的函数,它实际上在一个不同的线程中运行,因此释放主线程以便其他代码执行。