A: да, возможно, что узел может одновременно читать 4 файла.
Мой ответ будет, это зависит от вашей ситуации, для чтения файлов синхронно или асинхронно. Если это данные конфигурации или файлы могут быть кэшированы, я бы предложил просто сделать это синхронно, это просто, и это делается только один раз. Поэтому вы не будете долго ждать. Длительные операции при инициализации являются типичными и могут сделать вещи в долгосрочной перспективе более эффективными. При этом, читая четыре файла по порядку, асинхронно, чтобы ваша программа могла делать другие вещи в фоновом режиме, это не так сложно. Я буду работать над синхронизацией и асинхронными примерами каждого и добавить редактирование.
/* jshint node:true*/
var fs = require('fs');
function readFilesSync(fileNames) {
'use strict';
var results = '';
for (var i = 0; i < fileNames.length; i++) {
results += fs.readFileSync(fileNames[i]);
}
return results;
}
function readFiles(fileNames, callback) {
'use strict';
var results = '';
function readFile(index) {
if (index < fileNames.length) {
fs.readFile(fileNames[index], function (err, data) {
results += data;
readFile(index + 1);
});
} else {
callback(results);
}
}
readFile(0);
}
function readAllFilesAtOnce(fileNames, callback) {
'use strict';
var results = {};
var numFiles = fileNames.length;
function callBackWrapper() {
var resultsOrdered = '';
for (var i = 0; i < fileNames.length; i++) {
resultsOrdered += results[fileNames[i]];
}
callback(resultsOrdered);
}
function readFileAsync(fileName) {
fs.readFile(fileName, function (err, data) {
results[fileName] = data;
numFiles--;
if (numFiles === 0) {
callBackWrapper();
}
});
}
for (var i = 0; i < fileNames.length; i++) {
readFileAsync(fileNames[i]);
}
}
function doSomethingWithTheData(data) {
'use strict';
console.log('Results async: ' + data);
}
function doSomethingWithTheData2(data) {
'use strict';
console.log('Results async all at once: ' + data);
}
var fileNamesArray = ['blah.js', 'file.js', 'hello.txt'];
console.log('The results sync: ' + readFilesSync(fileNamesArray));
readFiles(fileNamesArray, doSomethingWithTheData);
readAllFilesAtOnce(fileNamesArray, doSomethingWithTheData2);
EDIT: Там я добавил метод для чтения всех файлов одновременно.
Process.nextTick выполняет не более, чем обработку этой функции в следующий раз вокруг цикла событий. EX:
process.nextTick(function() {
console.log('never printed out');
});
while(true);
экс 2:
process.nextTick(function() {
console.log('printed last');
});
console.log('printed first');
Я согласен, последовательная схема является лучшим способом сделать это. – francoisr
Спасибо, проклятье. узел может читать файлы одновременно. Но я все еще не знаю, почему. Я когда-либо думал, что узел может читать файл и обрабатывать сетевой запрос одновременно, но не читать два файла. Есть ли какая-то информация о том, как это сделал узел? –
Узел, с точки зрения сценариев, не имеет резьбы. Однако узел работает на V8-сервере. Как сервер V8 поддерживает параллелизм - это детали реализации, о которых нам не нужно беспокоиться. Но это может включать в себя процессы нереста, запуск потоков, внешние системные команды и т. Д. Пока он придерживается спецификации javascript. – ChrisCM