programing

읽기 쉬운 스트림을 종료하는 방법(종료 전)

topblog 2023. 8. 6. 09:05
반응형

읽기 쉬운 스트림을 종료하는 방법(종료 전)

Node.js에서 읽을 수 있는 스트림을 닫는 방법은 무엇입니까?

var input = fs.createReadStream('lines.txt');

input.on('data', function(data) {
   // after closing the stream, this will not
   // be called again

   if (gotFirstLine) {
      // close this stream and continue the
      // instructions from this if
      console.log("Closed.");
   }
});

이것은 다음보다 더 나을 것입니다.

input.on('data', function(data) {
   if (isEnded) { return; }

   if (gotFirstLine) {
      isEnded = true;
      console.log("Closed.");
   }
});

하지만 이것이 읽기 과정을 멈추지는 않을 것입니다.

편집: 좋은 소식!Node.js 8.0.0부터 시작readable.destroy공식적으로 이용 가능: https://nodejs.org/api/stream.html#stream_readable_destroy_error

스트림 읽기.파괴

언제든지 ReadStream.destroy 함수를 호출할 수 있습니다.

var fs = require("fs");

var readStream = fs.createReadStream("lines.txt");
readStream
    .on("data", function (chunk) {
        console.log(chunk);
        readStream.destroy();
    })
    .on("end", function () {
        // This may not been called since we are destroying the stream
        // the first time "data" event is received
        console.log("All the data in the file has been read");
    })
    .on("close", function (err) {
        console.log("Stream has been destroyed and file has been closed");
    });

공공 기능ReadStream.destroy는 문서화되어 있지 않지만(Node.js v0.12.2) GitHub(2012년 10월 5일 커밋)의 소스 코드를 볼 수 있습니다.

destroy내부적으로 기능을 표시ReadStream인스턴스가 파괴되어 호출됩니다.close파일을 해제하는 함수입니다.

닫기 이벤트를 청취하여 파일이 닫힌 시간을 정확하게 알 수 있습니다.종료 이벤트는 데이터가 완전히 사용되지 않는 한 실행되지 않습니다.


참고:destroy(및close) 함수는 특정한 off입니다.스트림 읽기.일반 stream.readable "interface"의 일부가 없습니다.

호출input.close()서류에는 없지만,

https://github.com/joyent/node/blob/cfcb1de130867197cbc9c6012b7e84e08e53d032/lib/fs.js#L1597-L1620

분명히 그 일을 합니다 :) 그것은 실제로 당신과 비슷한 일을 합니다.isEnded.

EDIT 2015-4월 19일 아래 주석을 기반으로 다음 사항을 명확히 하고 업데이트합니다.

  • 이 제안은 해킹이며 문서화되지 않았습니다.
  • 하지만 물살을 보기 위해서는.lib/fs.js1.5년 후에도 여전히 작동합니다.
  • 전화 건 것에 대한 아래의 의견에 동의합니다.destroy()우선적으로
  • 아래에 올바르게 기술된 바와 같이 이 작업은 다음과 같이 수행됩니다.fs ReadStreams의, 제네릭이 아닌Readable

일반적인 솔루션의 경우: 적어도 설명서를 이해하고 다음을 간단히 살펴보니 솔루션이 있는 것처럼 보이지 않습니다._stream_readable.js.

제 제안은 읽기 쉬운 스트림을 일시 중지 모드로 전환하여 적어도 업스트림 데이터 소스에서 추가 처리를 방지하는 것입니다.잊지 마세요unpipe()모두 제거data이벤트 청취자들이 할 수 있도록pause()문서에 언급된 것처럼 실제로 일시 중지됩니다.

현재 노드 10에서

readableStream.destroy()

읽을 수 있는 스트림을 닫는 공식적인 방법입니다.

https://nodejs.org/api/stream.html#stream_readable_destroy_error 을 참조하십시오.

버전에서4.*.*null 값을 스트림에 밀어넣으면EOF신호.

nodejs 문서에서

null이 아닌 값이 전달되면 push() 메서드는 후속 스트림 프로세서가 사용할 데이터 청크를 대기열에 추가합니다.null을 통과하면 스트림의 끝(EOF)에 신호를 보내 더 이상 데이터를 쓸 수 없습니다.

이것은 이 페이지에서 수많은 다른 옵션을 시도한 후 저에게 효과가 있었습니다.

그럴수는 없어요.Node 5.3.0에서 일반 Readable 스트림을 종료/셧다운/중단/삭제할 수 있는 문서화된 방법은 없습니다.이는 노드 스트림 아키텍처의 제한 사항입니다.

여기에 있는 다른 답변에서 설명했듯이, fs와 같은 노드에서 제공하는 Readable의 특정 구현에 대한 문서화되지 않은 해킹이 있습니다.스트림 읽기.그러나 이러한 솔루션은 Readable에 대한 일반적인 솔루션은 아닙니다.

여기서 누군가 제가 틀렸다는 것을 증명할 수 있다면, 그렇게 해주세요.저는 제가 불가능하다고 말하는 것을 할 수 있기를 바라며, 정정해 주시면 기쁘겠습니다.

편집: 해결 방법은 다음과 같습니다. 복잡한 일련의 호출을 통해 파이프라인을 구현하는 것입니다.그리고 그 모든 복잡성 이후에, 그것은 모든 경우에 제대로 작동하지 않습니다.

편집: 노드 v8.0.0에서 Readable 스트림에 대한 api추가했습니다.

파괴 모듈은 스트림이 파괴되어 서로 다른 API와 Node.js 버그를 처리하도록 하기 위한 것입니다.지금이 최선의 선택 중 하나입니다.

NB. 노드 10에서 다음을 사용할 수 있습니다..destroy추가 종속성이 없는 메서드입니다.

다을사음용여스닫지수있다습니을우고을트림하▁다▁you▁and▁▁the▁close로 스트림을 지우고 닫을 수 .yourstream.resume()스트림에 모든 것을 버리고 결국 닫히게 될 것입니다.

공식 문서에서:

readable.vmdk:

반환: 이 항목

이 방법을 사용하면 읽기 가능한 스트림이 '데이터' 이벤트를 다시 내보냅니다.

이 메서드는 스트림을 흐름 모드로 전환합니다.스트림의 데이터를 사용하지 않고 해당 '종료' 이벤트로 이동하려면 stream.resume()를 호출하여 데이터 흐름을 열 수 있습니다.

var readable = getReadableStreamSomehow();
readable.resume();
readable.on('end', () => {
  console.log('got to the end, but did not read anything');
});

오래된 질문이지만 저도 답을 찾고 있었고 구현에 가장 적합한 질문을 찾았습니다.둘다요.end그리고.close이벤트가 방출되기 때문에 이것이 가장 깨끗한 해결책이라고 생각합니다.

이렇게 하면 노드 4.4.*(작성 시점의 안정적인 버전)에서 다음과 같은 이점을 얻을 수 있습니다.

var input = fs.createReadStream('lines.txt');

input.on('data', function(data) {
   if (gotFirstLine) {
      this.end(); // Simple isn't it?
      console.log("Closed.");
   }
});

자세한 설명은 http://www.bennadel.com/blog/2692-you-have-to-explicitly-end-streams-after-pipes-break-in-node-js.htm 을 참조하십시오.

여기에 있는 이 코드는 유용하게 사용될 것입니다.

function closeReadStream(stream) {
    if (!stream) return;
    if (stream.close) stream.close();
    else if (stream.destroy) stream.destroy();
}

writeStream.end()는 writeStream을 닫는 방법입니다...

일부 통화 후 콜백 실행을 중지하려면 프로세스를 사용해야 합니다.특정 프로세스 ID를 사용하여 kill

const csv = require('csv-parser');
const fs = require('fs');

const filepath = "./demo.csv"
let readStream = fs.createReadStream(filepath, {
    autoClose: true,
});
let MAX_LINE = 0;


readStream.on('error', (e) => {
        console.log(e);
        console.log("error");
    })

    .pipe(csv())
    .on('data', (row) => {

        if (MAX_LINE == 2) {
            process.kill(process.pid, 'SIGTERM')
        }
        // console.log("not 2");
        MAX_LINE++
        console.log(row);
    })

    .on('end', () => {
        // handle end of CSV
        console.log("read done");
    }).on("close", function () {
        console.log("closed");
    })

언급URL : https://stackoverflow.com/questions/19277094/how-to-close-a-readable-stream-before-end

반응형