Arhn - архитектура программирования

Как node.js реализует асинхронный обратный вызов с одним процессом

Я не знаю, как узел реализует свою удивительную идею. И у меня есть вопрос, когда его использовать.
Мне нужно прочитать четыре файла file1.js file2.js file3.js file4.js и объединить их в один большой файл javascript result.js. Важно следить за их порядком.

Поэтому я использую readFileSync вместо readFile.
Я знаю, что это плохое решение. У кого-нибудь есть хорошая идея сделать это?

Вопрос. Может ли node.js читать четыре файла одновременно?

Надеюсь, кто-нибудь объяснит принцип node.js и когда будет запущен process.nextTick.


Ответы:


1

О: да, узел может читать 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);

РЕДАКТИРОВАТЬ: Там я добавил метод для чтения всех файлов одновременно.

Process.nextTick не более чем обрабатывает эту функцию в следующий раз в цикле обработки событий. БЫВШИЙ:

process.nextTick(function() {
    console.log('never printed out');
});

while(true);

ex 2:

process.nextTick(function() {
        console.log('printed last');
});

console.log('printed first');
30.07.2013
  • Я согласен, последовательный шаблон - лучший способ сделать это. 30.07.2013
  • Спасибо, это чертовски правильно. узел может одновременно читать файлы. Но я до сих пор не знаю, почему. Я когда-либо думал, что узел может одновременно читать файл и обрабатывать сетевой запрос, но не может читать два файла. Есть ли какая-то информация о том, как узел это сделал? 31.07.2013
  • Узел, с точки зрения сценариев, не является многопоточным. Однако узел работает на бэкэнде V8. То, как серверная часть V8 обрабатывает параллелизм, — это детали реализации, о которых нам не нужно беспокоиться. Но это может включать порождающие процессы, запуск потоков, внешние системные команды и т. д. При условии, что он соответствует спецификации javascript. 31.07.2013
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..