2013-11-27 5 views
0

동기 API가있는 타사 라이브러리가 있다고 가정합니다. 당연히 비동기식으로 사용하려고하면 "병렬"로 여러 가지 작업을 할 때 차단된다는 의미에서 바람직하지 않은 결과가 발생합니다.Node.js 동기 라이브러리 코드 차단 비동기 실행

이러한 라이브러리를 비동기 방식으로 사용할 수있는 일반적인 패턴이 있습니까?

은 (간결 NPM에서 async 라이브러리를 사용하여) 다음과 같은 예를 생각해

var async = require('async'); 

function ts() { 
    return new Date().getTime(); 
} 

var startTs = ts(); 

process.on('exit', function() { 
    console.log('Total Time: ~' + (ts() - startTs) + ' ms'); 
}); 

// This is a dummy function that simulates some 3rd-party synchronous code. 
function vendorSyncCode() { 
    var future = ts() + 50; // ~50 ms in the future. 

    while(ts() <= future) {} // Spin to simulate blocking work. 
} 

// My code that handles the workload and uses `vendorSyncCode`. 
function myTaskRunner(task, callback) { 
    // Do async stuff with `task`... 

    vendorSyncCode(task); 

    // Do more async stuff... 

    callback(); 
} 

// Dummy workload. 
var work = (function() { 
    var result = []; 

    for(var i = 0; i < 100; ++i) result.push(i); 

    return result; 
})(); 

// Problem: 
// ------- 
// The following two calls will take roughly the same amount of time to complete. 
// In this case, ~6 seconds each. 

async.each(work, myTaskRunner, function(err) {}); 

async.eachLimit(work, 10, myTaskRunner, function(err) {}); 

// Desired: 
// -------- 
// The latter call with 10 "workers" should complete roughly an order of magnitude 
// faster than the former. 

포크/가입하거나 산란 작업자 프로세스를 수동으로 내 유일한 옵션은?

답변

0

예, 유일한 옵션입니다.

50ms의 CPU 시간을 사용하여 10 번 수행해야하는 경우 CPU 시간이 500ms가 필요합니다. 벽시계 시간이 500ms보다 짧아 지길 원하면 더 많은 CPU를 사용해야합니다. 이는 다중 노드 인스턴스 (또는 스레드 풀에 작업을 푸시하는 C++ 애드온)를 의미합니다. 여러 인스턴스를 얻는 방법은 app 구조에 따라 다르며 child_process.send()를 사용하여 작업을 제공하는 자식은 하나의 방법이며 클러스터가있는 여러 서버를 실행하는 것은 또 다른 방법입니다. 서버 분리는 다른 방법입니다. 이미지 저장소 응용 프로그램을 말하면 누군가가 이미지를 다른 형식으로 변환하고 CPU 사용량을 많이 요구하지 않는 한 대부분 요청을 처리하는 것이 빠릅니다. 이미지 처리 부분을 다른 앱으로 푸시하고 REST API를 통해 액세스하여 메인 앱 서버를 응답하도록 남겨 둘 수 있습니다.

요청을 처리하는 데 CPU가 50ms가 걸리는 것이 아니라, CPU 요청을 처리 할 때 다른 요청 처리를 인터리브 할 수 없다고 우려한다면, 작은 청크로 작업하고 setInterval()로 다음 청크를 예약하십시오. 그것은 일반적으로 무시 무시한 해킹입니다. 앱을 재구성하는 것이 좋습니다.