본문 바로가기
node.js

exec event loop

by 루에 2015. 12. 7.
반응형

싱글스레드 기반으로 구동하는 node.js는 blocking문제가 있다. 즉, 하나의 작업이 오래 걸릴 경우 다른 작업이 수행되지 못하는 것이다.


이것을 해결하기 위해 node.js는 이벤트 루프 기반으로 구동된다. callback이다.


이전에 보았던 예제의 구조를 보면, index에서 requestHandlers의 메소드를 세팅하고, server에서 router를 call한 뒤 결과값을 server에서 뿌린다.


문제가 없어보이지만, 이렇게 직관적으로 접근을 할 경우 blocking이 발생한다.


이를 해결하기 위해 코드를 수정한다.


server.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var http = require("http");
var url = require("url");
// var querystring = require("querystring");
 
function start(route, handle){
    http.createServer(function(request, response){
        console.log("Request received.");
 
        var pathname = url.parse(request.url).pathname;
 
        route(handle, pathname, response);
 
        // response.writeHead(200, {"Content-Type": "text/plain"});
        // response.write("Hello World");
        // response.end();
    }).listen(8888);
 
    console.log("Server has started");
}
 
exports.start = start;
cs


기존의 화면을 뿌리는 코드를 주석처리하고 route()의 파라미터에 response를 추가했다. 이제 server.js에서는 화면 처리를 하지 않는다.


route.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function route(handle, pathname, response){
    console.log("About to route a request for " + pathname);
    if(typeof handle[pathname] === 'function'){
        handle[pathname](response);
    }
    else {
        console.log("No request handler found for" + pathname);
        response.writeHead(404, {"Content-Type""text/plain"});
        response.write("404 Not found");
        response.end();        
    }
}
 
exports.route = route;
cs


handle()의 파라미터에 reponse를 보낸다. 그리고 server에서 화면처리를 하지 않으므로 요청 경로를 찾지 못할 경우의 처리도 이 곳에서 한다.


requestHandlers.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var exec = require("child_process").exec;
 
function start(response) {
    console.log("Request handler 'start' was called");
    var content = "empty";
 
    exec("dir /w"function(error, stdout, stderr){
        response.writeHead(200, {"Content-Type""text/plain"});
        response.write(stdout);
        response.end();
    });
 
    return content;
}
 
function upload(response){
    console.log("Request handler 'upload' was called");
    response.writeHead(200, {"Content-Type""text/plain"});
    response.write("Hello Upload");
    response.end();
}
 
exports.start = start;
exports.upload = upload;
cs


핵심이다. child_process라는 node.js에서 지원하는 모듈을 사용했다. 이 모듈은 callback을 지원하며 비동기적으로 동작한다. 7~11번 라인이 그것이다. callback을 경험해본 사람이라면 금방 알 수 있을 것이다. 이러한 콜백 구조를 통해 node.js는 여러 개의 요청이 오거나 하나의 작업이 오래 걸릴 경우에 대비한다.

반응형

댓글