>

간단한 node.js 변환 스트림이 있다고 가정 해 봅시다 :

export class JSONParser extends stream.Transform {
  constructor() {
    super({objectMode: true});
  }
}

한동안 항목을 동 기적으로 처리 한 다음 나머지를 지연시키고 싶습니다. 다음과 같은 것 :

export class JSONParser extends stream.Transform {
  count = 0;
  constructor() {
    super({objectMode: true});
  }
  _transform(chunk, encoding, cb) {
   const modifiedChunk = this.modify(chunk);
   if(count++ % 55 === 0){
     process.nextTick(() => this.push(modifiedChunk));
     return;
   }
     this.push(modifiedChunk);
  }
}

이론적으로 이것은 55 개 정도의 항목마다 스트림이 다음 항목까지 처리하여 나머지 항목을 처리 함을 의미합니다. 질문-

<올>
  • 이것은 나머지 모든 아이템들의 처리를 지연시킬 것인가, 아니면이 하나의 덩어리를 지연시킬 것인가? 푸시 된 청크의 순서를 유지합니까?

  • 토큰 버킷 알고리즘이 속도 제한을 수행 할 수 있다고 생각하는데 이벤트 루프가 아닌 블로킹 스트림을 얻는 더 좋은 방법일까요?

    • 답변 # 1

      process.nextTick은 비동기 메서드입니다. 기존 프로세스 스택이 완료된 후 전달한 메소드를 호출합니다.

      따라서 푸시 될 아이템의 순서는 (112 개의 아이템이 있다고 가정) :

      1,2,3,4 ... 54, 56, 57, ..., 109, 111, 112, 55, 110

    • 답변 # 2

      이 경우 setImmediate not process를 사용하는 것이 좋습니다 .nextTick이 I/O를 굶주릴 것입니다 :

        if(count++ % 55 === 0){
           setImmediate(() => this.push(modifiedChunk));
           return;
         }
      
      

      대신 :

        if(count++ % 55 === 0){
           process.nextTick(() => this.push(modifiedChunk));
           return;
         }
      
      

  • 이전 python - 두 개의 목록이 주어진 정렬 행렬을 만드는 방법
  • 다음 html - z- 색인을 사용한 후에도 텍스트가 컨테이너 위에 흐리게 표시되지 않습니다