2013-08-11 4 views
2

코드 병렬화와 관련하여 async 패키지의 동작을 이해하려고합니다. 내가 이해 한 바로는, 콜백 지옥/수프를 피하기 위해 코드를 구조화하는 것이 도움이되지만 그게 유일한 이점일까요? 위의 코드에서 async.parallel도 코드를 병렬 처리합니까?

async.parallel([ 
    function(next) { 
     apiCallTo3rdParty(next); 
    }, 
    function(next) { 
     apiCallTo3rdParty(next); 
    }, 
    function(next) { 
     apiCallTo3rdParty(next); 
    } 
], function(err, res) { 
    // do something else with returned data 
}); 

은 세 가지 API 호출은 다른가 완료 될 때까지 기다리지 않고 할 것입니다. 사양대로. 나머지는 이전에 완료되었으므로 가장 긴 API 호출이 반환 된 후 최종 콜백이 호출됩니다. 내가 코드를 변경 한 경우 있도록

그러나,이 작업을 차단 몇 만든,

async.parallel([ 
    function(next) { 
     sleep(5); 
    }, 
    function(next) { 
     sleep(5); 
    }, 
    function(next) { 
     sleep(5); 
    } 
], function(err, res) { 
    // do something else with returned data 
}); 

은 액면 "Node.js is Single Threaded" 촬영? 무슨 일이 일어날 것입니다, 우리는 의미로 받아하려는 async 블록 것이라고 15 초 후에 최종 콜백을 실행하지만 "Node.js가 자체 내부 스레드 풀을 유지한다는 것을 알면 Node는 자체 스레드에서 각 콜백을 실행하고 함수를 실제로 병렬 처리하며 5 초 후에 최종 콜백을 호출한다고 가정 할 수 있습니다 ?

+0

"Node.js 자체 자체 스레드 풀"AFAIK를 유지합니다. 사실이 아닙니다. – SLaks

+0

@SLaks 나는 믿는다. 그러나 주된 스레드가 아닌 스레드는 코드를 파싱하고 최적화하는 것만을 수행한다. –

답변

1

짧은 대답 : 코드 실행에 15 초가 걸립니다. 왜?

자바 스크립트에 병렬 코드를 실행할 방법이 없습니다. 이벤트 루프를 차단하지 않고 동기 코드를 실행하는 유일한 방법은 작업자를 스폰하는 것입니다. 비동기 모듈은 작업자를 신경 쓰지 않기 때문에 다음 함수를 호출하기 전에 함수가 완료 될 때까지 기다려야합니다.

는 다음과 같은 고려 :

sleep(5) 
sleep(5); 
sleep(5); 

분명히 15 초 정도 걸릴 것입니다. 이제 당신이 할 경우에도이 "병렬"방식의 비동기 수행합니다

function parallel() { 
    process.nextTick(function(){ 
    sleep(5); 
    }); 
    process.nextTick(function(){ 
    sleep(5); 
    }); 
} 
parallel(); 
console.log("this is called immediately"); 

process.nextTick(function(){ 
    console.log("this is called 10 secs later"); 
}); 

코드는 즉시 실행되지만 빨리 방법 대기하고 사람들에게 이벤트 루프 수율, 그들은 실행에서 거 블록 다른 코드입니다.

+0

설명 주셔서 대단히 감사합니다. 내 자신의 독립적 인 테스트에서도이 사실을 확인했으며, 비동기는 근로자를 걱정하지 않는다 (너무 나쁘다!). 확실히 노드를 최적화하는 데 신경을 써야 차단 작업을 최소로 유지할 수 있습니다. –