2017-01-20 1 views
1

이 코드는 주기적으로 load 함수를 호출합니다.이 함수는 10 초가 걸리는 작업을 매우 많이로드합니다. 문제는 load 함수가 실행 중일 때 주 흐름을 차단하는 것입니다. load이 실행되는 동안 건강 검진과 같은 간단한 GET 요청을 보내면 load 호출이 완료 될 때까지 GET 통화가 차단됩니다.기능을 백그라운드에서 실행하려면 어떻게해야합니까?

function setLoadInterval() { 
    var self = this; 
    this.interval = setInterval(function doHeavyWork() { 
     // this takes 10 sec 
     self.load(); 
     self.emit('reloaded'); 
    }, 20000); 

나는 async.parallel을 시도했지만 여전히 GET 호출이 차단되었다. 나는 setTimeout을 시도했지만 같은 결과를 얻었습니다. load을 백그라운드에서 실행하여 메인 플로우를 차단하지 않으려면 어떻게해야합니까?

this.interval = setInterval(function doHeavyWork() { 
    async.parallel([function(cb) { 
     self.load(); 
     cb(null); 
    }], function(err) { 
     if (err) { 
     // log error 
     } 
     self.emit('reloaded'); 
    }) 
}, 20000); 
+1

'self.load();'가 정확히 10 초가 걸리는 이유는 무엇입니까? 내 말은 별도의 프로세스에서 수행 할 수 있다면 fork | spawn | exec 중 하나를 사용하여 이벤트 루프를 차단하지 않습니다. – Molda

+0

지도에서 1M 키 값 쌍을 읽고 일부 필터링을 수행합니다. – codereviewanskquestions

+0

질문은 당신이 필요로하는 것을하기위한 더 좋은 방법이 아닙니까? 데이터가 DB에서 온 것이면 왜 DB를 사용하게할까요? 좀 더 구체적 일 수 있다면 다른 방법이있을 수도 있습니다. – Molda

답변

1

Node.js를 이벤트가 IO 모델을 IO가 기본 엔진 별도의 쓰레드로 오프 로딩하고, 따라서 병렬 처리가 달성된다

뭐든지 비 차단 구동된다. 작업이 CPU를 많이 사용하는 경우 기본적으로 병렬 처리를 수행 할 수있는 방법은 없습니다. 자바 스크립트는 블로킹 동기화 언어입니다.

그러나 CPU 집중 작업을 다른 프로세스로 오프로드하여이를 수행 할 수있는 몇 가지 방법이 있습니다.

옵션 1 : 점에서
간부 혹은 부하 자식 프로세스를 생성 및 실행() 함수는 노드 앱 스폰. 이 간격은 다른 사람이 해고 한 시간만큼 10 초 프로세스가 완료 될 때까지 20000ms마다 발생합니다. 내가 얼마나 많은 데이터 self.load를 잘 모릅니다 () 받아 반환 : 그것은 당신의 시스템 자원

옵션 2를 먹고 너무 많은 노드 애플리케이션을 산란 수
은 그렇지 않으면 위험하다. 평범하고 네트워크 오버 헤드가 허용되는 경우 해당 작업을 1M 레코드를 받아들이고 (오히려 가리키고) 필터링 된 레코드를 반환하는로드 균형 조정 된 웹 서비스 (4 개의 웹 서버가 병렬로 실행될 수 있음)로 만듭니다.

참고 병렬 기능 비동기 노드를 사용하는 것 같습니다
. 그러나 문서에서이 설명을 적어 두십시오.

참고 : 병렬은 코드의 병렬 실행이 아니라 병렬로 I/O 작업을 시작하는 것에 관한 것입니다. 태스크가 타이머를 사용하지 않거나 I/O를 수행하지 않으면 실제로 일련의 태스크가 실행됩니다. 각 작업에 대한 모든 동기 설정 섹션이 차례로 발생합니다. JavaScript는 단일 스레드로 유지됩니다.

관련 문제