Как мне дождаться окончания и закрытия потока чтения, чтобы запустить другой поток чтения? - PullRequest
0 голосов
/ 24 марта 2020

Я работаю в Node.JS, и мы открываем поток чтения из CSV, загружаем эти данные в чанки, обрабатываем каждую строку этих чанков с помощью регулярных выражений и сравниваем их с другим файлом данных, а затем передаем их в поток записи для записи в новый файл

Проблема в том, что второй поток чтения (называемый бета) для файла сравнения занимает больше времени, чем первый поток чтения (называемый альфа) в некоторых случаях, и это приводит к тому, что не все данные сравнения готовы к go и доступны для чтения, что приводит к нулевым значениям Я не уверен, как мне удастся заставить альфу удерживать выполнение и не запускаться до тех пор, пока бета не вызовет readStream.on (end), как мне кажется, go об этом, потому что во всех моих попытках с обещаниями и ожиданием зацикливается, либо полностью замораживает программу, либо совсем не ждет, пока бета-версия завершит работу sh, и завершает выполнение до того, как ее завершат. Единственное решение, которое я нашел, - это поместить бета-версию непосредственно в основной код и поместить альфа-код жестко закодированным в функцию бета readStream.on (end), однако из-за того, что бета-версия будет работать на основе данных, которые мы используем , это означает, что мне придется иметь несколько повторений альфа в каждом экземпляре беты в основном коде, заблокированном в операторах switch или if, и мне это совсем не нравится

Это было огромной проблемой для несколько дней, и я в конце моей веревки об этом. Ничего не сработало

Отметим, что на вспомогательный скрипт для запуска беты ссылается оператор require, а переменные и скрипты возвращаются ему с помощью module.exports. Я попытался поместить весь бета-поток в функцию в module.exports и дождаться возврата true, либо изменить значение, либо вызвать альфа из этой функции, передав во вторичный скрипт и вернув его, однако он все еще никогда не ждет, пока бета завершится sh, прежде чем она взлетит, и делает свое дело

Прошу прощения за длинный текст

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

postValid = require("./postValid.js");
postValid.country = country;
fs.createReadStream(postValid.country + " ADDRESS REF DATA.csv")
    .pipe(csv({e: null, headers: false, separator: '\t'}))
    //Indicate start of reading
    .on('resume', (data) => console.log("Reading complete postal code file..."))
    //Pass data to be buffered and chunked to the processing script
    .on('data', (data) => {
        //Each line of data gets processed as needed and stored here
    })
    .on('end', () => {
        postValid.complete = true;
        console.log("Done reading");
        ThisFunc();
    });

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

function ThisFunc() {
    //Do a quick parse of the csv to get a row count
    fs.createReadStream(fileName)
        .pipe(csv())
        .on('resume', () => {
            console.log("Getting file length...");
            postValid.complete = false;
        })
        .on('data', () => initLen++)
        .on('end', () => {
            console.log("The csv is " + initLen + " lines long, beginning processing")

        //Length of 1/100 of the file size, needs to be modular to file length rounded up
        chunkLen = Math.round(initLen/100);

        //Read the CVS filestream
        fs.createReadStream(fileName)
          .pipe(csv())
          //Indicate start of reading
          .on('resume', () => {
            console.log("Loading...");
          })
          //Pass data to be buffered and chunked to the processing script
          .on('data', (data) => {
            //Lines of data get passed into the processing script here
          })
          //End of reading
          .on('end', () => {
            //Read the final chunk of lines that don't fit and process them
            console.log("100%");

            //Print results
            console.log("File Length: " + results.length);
            console.log("Processed: " + finalAdd.length);
            console.log("Found Code: " + postCodes);
          });
    });
}

Я удалил немного кода чтобы это было законно, в нем должны быть все важные биты. Файлы могут быть чем-то между несколькими миллионами строк или несколькими тысячами

...