nodejs和非阻塞的噩梦

时间:2011-05-09 20:59:34

标签: mysql node.js nonblocking

我目前正在使用node.js和MySQL开发API。我是这个非阻塞的新手,我有一个问题。我正在使用节点和MySQL模块。

假设我们有这样的功能:

function doQuery(sql, callback) {
    connect(); //does the Client.connect()
    client.query(sql, function(err, results, fields) {
        if (err) {
            errorLog.trace(err, __filename);
            throw err;
        } else {
            logger.trace('DATABASE ACCESS: {query: ' + sql + '} result: OK', __filename);
        }
        client.end();

        callback(results);
    });
}

一切运行正常,回调处理值的返回,但有些东西困扰我。我的浏览器是什么,直到响应回来,我不知道这是因为在此期间节点实际上是被阻止的。

那么,我如何知道某个操作是否实际阻塞了我的节点进程?我认为当您将回调传递给函数时,节点会自动处理它并将此回调的执行放在事件循环的队列中。但我真的不确定那个

这一切对你有意义吗?

1 个答案:

答案 0 :(得分:15)

浏览器等待和node.js阻塞之间存在差异。

浏览器必须等待,因为它无法立即恢复数据。一旦发回响应,浏览器将停止等待。仅仅因为浏览器正在等待并不意味着node.js正在阻塞。它只是意味着连接仍然是打开的

Node.js在等待回调时闲置。它没有阻止。

node.js可以与浏览器客户端建立数千个打开的连接。这并不意味着它在每一个上都是阻塞的。它只是意味着它处于空闲状态,直到它有一个要处理的回调或一个新的请求来处理。