为什么response.write会阻塞线程?

时间:2017-09-22 01:24:52

标签: node.js http response.write

以下是以下示例:



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;
&#13;
&#13;

当服务器处理第一个请求时,线程被阻止,无法处理第二个请求。我想知道为什么会发生这种情况,因为nodejs使用事件驱动的非阻塞I / O模型。

1 个答案:

答案 0 :(得分:1)

很棒的问题。

NodeJS使用非阻塞 I / O 模型;也就是说,I / O操作将在不同的线程下运行,但所有JavaScript代码都将在同一个事件循环驱动的线程上运行。

在您的示例中,当您要求HTTP服务器侦听传入请求时,Node将在引擎盖下的单独线程上管理套接字侦听操作,以便在调用server.listen()后代码可以继续运行。 / p>

当请求到来时,您的server.on('request')回调将在主事件循环线程上执行。如果另一个请求进入,则在第一个回调和当前在主线程上执行的任何其他代码完成之前,它的回调不能运行。

大多数情况下,回调是短暂的,所以你很少需要担心阻塞主线程。如果回调不是短暂的,它们几乎总是调用一个异步I / O相关的函数,它实际上在一个不同的线程中运行,因此释放主线程以便其他代码执行。