Node.js의 비동기 반복 패턴 - 2 부

이것은 이전 기사 "비동기 반복 패턴"의 후속 조치입니다.

최신 피드백은 훌륭했으며 일부 수정 및 의견은 저에게 전달되었습니다.

또한, 일부 node.js 증오는 비동기 IO를 처리하는 데 필요한 몇 번 추가 된 복잡성으로 인해 확산되었습니다. 비동기 IO를 처리하는 것에 대한 두려움을 퍼트 리고이를 처리하는 방법에 대한 나의 견해를 모으고 전파하려는 의도는 아닙니다. 제 견해로는, 무위험 주의자는 좋으며 여기에 머물러 있으려면 그것을 포용하는 법을 배워야합니다.

그러나 첫째, 수정 :

Doh!

일부 독자들은 비동기 IO 작업을 호출하여 스택에서 이미 분리 중이므로 serialize_timeout.js 버전 (setTimeout을 사용하여 스택에서 분리하는 부분)이 필요하지 않다는 경고를 받았습니다.

너 맞아.

사과와 오렌지 - 공정한

node.js IO 프로그래밍과 "정상적인"블로킹 프로그래밍을 비교하려고한다면, 공정하고 합당한 두 객체를 비교해 보겠습니다.

필자의 견해로, IO API를 차단하지 않는 IO API와 구문을 비교하는 것은 공정하지 못합니다. 차단을 사용하면 훨씬 많은 작업을 수행 할 수 있기 때문입니다. 두 가지를 모두 비교하려면 node.js 솔루션과 차단 세계의 다음 솔루션을 비교해야합니다.

비 차단 입출력은 백그라운드에서 많은 입출력 작업을 수행 할 수 있기 때문에 차단 세계에서 동일한 기능을 비교하는 것이 타당합니다.

블로킹 세계에서 똑같은 동작을하기 위해서는 먼저 스레드 풀을 가지고 있어야합니다. 아니요, 각 IO 작업에 대해 새 스레드를 새로 만들지 않아도됩니다. node.js가 해당 오버 헤드를 없애기 때문입니다.

그런 다음 각 IO 작업을 스레드 풀의 새 스레드에 할당해야합니다.

그런 다음 주 스레드는 그 중 하나에서 완료 신호를 기다리는 것을 차단합니다.

각 스레드는 모든 작업이 언제 완료되는지를 알기 위해 전역 완료 카운터를 유지해야합니다. 그리고 예, 스레드 액세스를 해당 메모리에 동기화해야합니다.

한 스레드가 모든 작업이 완료되었음을 감지하면 차단 해제를 위해 대기중인 주 스레드에 알립니다. 제 의견으로는 간단하지 않습니다.

공동 루틴, 연속체, 파이버로 협업 멀티 태스킹을 호출 할 수도 있습니다. 단순화 될 것입니다. 카운터에 대한 액세스를 동기화 할 필요는 없지만 여러 컨텍스트를 관리해야합니다. 또한, 내 생각에 단순하지.

추상화

또한이 기사는 기본 패턴과 그 결과를 폭로하는 데 도움이되었습니다. 일상적인 프로그래머는 이러한 복잡성을 처리 할 필요가 없습니다. 그래서 일부 추상화가 고안되었습니다.

다음은 그 중 하나입니다.

단계

단계는 Tim Caswell의 흐름 제어 라이브러리입니다. 그것은 쉬운 방법으로 체이닝 콜백을 허용합니다.

예를 들어 async라고하는 함수가 있다고 가정 해 봅시다. 비동기 IO를 시뮬레이션하여 데이터베이스 상호 작용에서 벗어나게합니다.

function async(i, callback) {
  timeout = Math.round(Math.random() * 3000);
  setTimeout(function() {
    console.log(i + ' is done');
    callback();
  }, timeout);
}

다음으로 npm을 사용하여 단계를 설치해야합니다.

$ npm install step

그런 다음 데이터베이스에 10 개의 요소를 병렬로 삽입해야합니다.

var Step = require('step');

var collection = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

Step(

  function insertAll() {
    var self = this;
    collection.forEach(function(element) {
      async(element, self.parallel());
    });
  },
  function finalize(err) {
    if (err) { console.log(err);return;}
    console.log('done with no problem');
  }
);

당신은 단순히 2 개의 기능을 가진 step을 사용할 것입니다.

처음에는 모든 요소를 ​​병렬로 삽입합니다. 콜백에 this.parallel ()을 전달하면 병렬 요청을 처리하는 콜백을 생성하는 방법입니다.

블로그 이미지

칩사마코더

,