2013-07-24 2 views
1

노드에서 비동기 라이브러리를 이해하고 사용하려고합니다. 내가 실제로 이해하지 못하는 것, async.parallel 함수가 어떻게 작동했는지. 난 결과 Async가 병렬 함수에 대해 혼동했습니다.

[ 'one', 'two' ] 

멀티 스레드에서 실행 async.parallel 수행

을 가지고

async.parallel([ 
    function(callback){ 
     setTimeout(function(){ 
      console.log('1'); 
      callback(null, 'one'); 
     }, 200); 
    }, 
    function(callback){ 
     setTimeout(function(){ 
      console.log('2'); 
      callback(null, 'two'); 
     }, 100); 
    } 
], 
// optional callback 
function(err, results){ 
    if(err){ 
     console.log('Error'); 
    } else { 
     console.log(results); 
    } 
    // the results array will equal ['one','two'] even though 
    // the second function had a shorter timeout. 
}); 

: 이름은 고려,이 같은 멀티 스레딩 보인다 다음 샘플을 평행? 그렇지 않다면, 병렬로 표현 된 이름은 무엇입니까?

답변

7

배열 내에 결과를 배치하는 것은 병렬로 전달하는 배열 내에 해당 함수를 배치하는 것입니다. 병렬로 전달하는 함수는 동일한 인수를 가져야합니다. 이러한 기능은이 방법을 사용하여이

someArrayOfFunctions[index](arguments); 

같은 래퍼에 배치하고 호출되는 포토, 비동기 gaurantees 평행 완료 내의 함수의 결과의 사용을 통해, 예상 순서 배열에 배치 될 때와 무관 한 것을 인덱스를 기반으로 결과를 채우는 콜백 특정 구현은 중요하지 않습니다. 실제로 완료되면 언제든지 각각의 실행 결과는 타이밍을 기반으로하지 않고 배열에 함수가있는 위치에 따라 배치됩니다.

두 번째 질문에 따라 async.parallel이 진정으로 병렬인지 여부. 그렇지 않습니다. 다음 예제를 참조하십시오.

var async = require('async'); 

async.parallel([ 
    function(callback){ 
     while(true);//blocking! 
    }, 
    function(callback){ 
     console.log('Not Blocked');//Never get's called 
    } 
]); 

두 번째 함수는 호출되지 않습니다. 비동기가 제공하는 병렬 기능 덕분에 사용자는 자신의 예를 혼동스럽게 여깁니다. 비동기 코드의 문제점은 노드에서 실제로 병렬 처리되는 일련의 콜백 (디스크 I/O, 네트워크 I/O 등)을 완료해야 할 때가 있지만, 예기치 않은 간격으로 예를 들어 여러 소스에서 수집 할 구성 데이터가 있고 동기화 방법이 제공되지 않는다고 가정 해보십시오. 이러한 작업을 순차적으로 실행하고 싶지는 않습니다. 이로 인해 작업이 상당히 느려지지만 결과를 순서대로 수집하려고하기 때문입니다. 이것은 async.parallel의 주요한 예입니다. 그러나 no, async.parallel은이 블로킹 예제에서 보여 지듯이 동기 코드를 비동기 적으로 실행할 수 없습니다.

노드의 참 병렬 처리는 V8 백엔드 내에 있습니다. 이 병렬 처리를 제공하는 유일한 방법은 노드의 대체 버전을 릴리스하거나 네이티브 확장을 개발하는 것입니다.

+0

async.series와 async.parallel의 차이점을 알려주십시오. 나는 그것을 예제로 시도하지만 차이점을 보지 못했습니다. –

+0

Async.series는 일련의 비동기 작업을 수행하고 배열의 각 함수가 앞에있는 함수의 콜백 인 것처럼 직렬로 실행합니다. Async.parallel은 일련의 비동기 작업을 수행하여 병렬로 실행하고 콜백을 호출하여 프로그램 흐름으로 돌아갑니다. 이상적으로 병렬로 채워진 배열의 데이터를 활용하는 것이지 그렇지 않으면 왜 사용하고 있습니까? , 권리?) – ChrisCM

관련 문제