2013-05-12 2 views
1

저는 nodejs와 expressjs 프레임 워크를 사용하여 매우 기본적인 웹 사이트를 구현하고 있습니다. 아이디어는 사용자가 웹 사이트를 입력하고 서버에서 CPU 집약적 인 작업을 트리거하는 버튼을 클릭하고 작업 완료시 브라우저에서 메시지를 가져 오는 것입니다.내 nodejs 앱을 여러 사용자에게 제공하려면 어떻게해야하나요?

나를 혼란스럽게하는 부분은 이벤트 루프를 차단하지 않고 각 사용자에 대해이 작업을 수행하는 방법입니다. 따라서 다른 사용자가 다른 작업을 마칠 때까지 기다릴 필요가 없습니다. 또한 각 사용자에 대해 사용 된 자원 (객체, 변수 ..)의 새 인스턴스를 사용하는 방법.

놀고 놀고 난 후에, 나는 child-process를 보았다. 기본적으로, 각 사용자에 대해 새로운 child_process를 포크화할 것을 고려했기 때문에 정렬에 걸리는 시간은 이벤트 루프를 차단하지 않습니다. 그러나, 이것이 그러한 시나리오에서 가장 좋은 것인지 아직 확신 할 수 없습니다.

이제 저는 단 한 명의 사용자로 작업을 완료했습니다.하지만 다른 사용자를 시작하려고하면 작업이 복잡해지고 변수가 공유됩니다. 나는 모듈에서 선언 된 전역 변수를 사용해서는 안되지만 하나의 모듈 내에서 함수간에 변수를 공유하는 또 다른 방법이 될 수 있지만 각 사용자마다 다릅니다.

나는이 질문이 매우 기본적인 것처럼 들리 겠지만, 노드 j가 어떻게 각기 다른 사용자들에게 새로운 변수, 각 개별 사용자와 관련된 객체를 제공하는지에 대한 아이디어를 놓치고있다.

즉, 내 질문은 다음과 같습니다. 1- 노드가 여러 사용자를 동시에 어떻게 지원합니까? 2 - 언제 내가 어떻게 후드에서 새로운 하위 프로세스를 포크 팅하거나 실행할 것인가? 그리고 각 사용자 또는 CPU의 #core를 기반으로해야합니까? 3 각 사용자에 대해 내 응용 프로그램에서 리소스를 분리하는 방법 각 사용자는 자신의 카운터, 이메일 및 기타 객체와 변수를 가지고 있습니다. 4- 언제 자녀의 과정을 중단해야합니까?

미리 감사드립니다.

CODE : MY 정렬 모듈

var cp = require('child_process'); 
var child= cp.fork('./routes/mysort-module'); 

exports.user=function(req,res){ 
    // child = new cp.fork('./routes/mysort-module'); // Should I make new child for each user? 
    child.on('message',function(m){ res.send('DONE');} 
    child.send('START PROCESS'); // Forking a cpu-intensive task in mysort-module.js 

} 

: 당신은 당신의 질문을 분할하려고한다

var variables = require(...); 
//GLOBAL VARIABLES to be shared among different functions in this module 
process.on('message',function(m){ 
    //sort cpu-intensive task 
    process.send('DONE'); 
}); 
// OTHER FUNCTIONS in THE MODULE that make use of global variables. 

답변

2

. 그러나 이것이이 질문에 응답하기를 바랍니다.

질문 1 : 전역 변수는 요청 범위에만 국한되지 않습니다. 이것은 글로벌에 대한 노드의 정의의 일부이며이를 어떻게 든 시행하는 것은 의미가 없습니다. 전역을 사용해서는 안됩니다.

http.createServer(function(req, res) { 
    var a = 1; 
    // req, res, and a are in request scope for your user-associated response 
}); 

제거 전역이 어려운이어야한다 : 모듈 A와 B의 주 글로벌 G 및 모듈 C가 A.doThis를 호출하면() 및 B

요청 범위는 HTTP 모듈 주어진다 .doThat(), C를 변경하여 A.doThis (G)와 B.doThat (G)를 대신 호출하십시오. G의 모든 어커런스에 대해 이것을 수행하고 범위를 로컬 또는 요청으로 줄이십시오.

또한 한 클라이언트에서 여러 요청을 처리해야하는 경우 "세션"을 찾아야합니다.

질문 2 : 요청 처리기 내부의 자식 프로세스를 시작 :

exports.user = function(req,res){ 
    child = new cp.fork('./routes/mysort-module'); 

질문 3 : 참조 질문 하나?

질문 4 : 프로세스가 계산 된 결과를 반환 한 후.

process.on('DONE', function(result) { 
    process.exit(); 
    // go on and send result to the client somehow... 
}); 
+0

답변 주셔서 감사합니다. 세션을 확실히 고려해 보겠습니다. 그리고 나누어 준 제안에 감사드립니다. 나는 또한 그것이 한 가지 질문에 너무 많은 것을 알았습니다!. 그러나, 나는 아직도 질문 3에 대해 확신하지 못한다. 아마도 내 q를 올바르게 형성하지 못했을 것이다. 내 질문은, 각 요청에 대해 자식 프로세스를 시작하는 것이 타당한가? 또는 프로세스 수는 코어 수로 제한되어야합니다! 감사! – saigammar

관련 문제