nodejs и неблокирующий кошмар - PullRequest
3 голосов
/ 10 мая 2011

В настоящее время я разрабатываю API с использованием node.js и MySQL. Я новичок в этом неблокирующем материале, и у меня есть вопрос. Я использую узел и модуль 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 Ответ

15 голосов
/ 10 мая 2011

Существует разница между ожиданием браузера и блокировкой node.js.

Браузер должен ждать, потому что он не может вернуть данные мгновенно. Браузер перестанет ждать, как только вы отправите ответ обратно. То, что браузер ждет, не означает, что node.js блокирует. Это просто означает, что соединение все еще открыто

Node.js бездействует, пока вы ожидаете обратного вызова. он не блокирует.

node.js может иметь тысячи открытых соединений с клиентами браузера. Это не значит, что это блокирует каждого. Это просто означает, что он работает вхолостую, пока не получит обратный вызов для обработки или новый запрос для обработки.

...