2011년 5월 20일 금요일

[node.js] 모든 것이 비동기다?

비동기라는건, 실행 순서가 순차적이지 않다라고 말해야 되려나... 일 처리를 혼자서 하는 것과 여러명이 하는 것의 차이라고도 볼 수 있다.

혼자서 일을 할 때는 순차적으로 일을 할 수 밖에 없다. 이 일을 끝내고 저 일을 처리해야 한다.

하지만 여러명과 일을 할 때는 나는 여러 명에게 일을 시키고 결과물을 가져올 때 까지 쉬고 있을 수 있다.

이렇게 설명하니 대단하다! 마치 내 부하 직원이 여럿 생긴 것 같거든! 하하;;

예제


아래 코드가 있다.
var fs = require('fs');
var sys = require('sys');

fs.readFile('example.js', function(report) {
    sys.puts('example.js -> ' + report);
});

fs.writeFile('testoutput.txt', 'testmessage...', function() {
    sys.puts('write to testoutput.txt!');
})

sys.puts('end...');
약간 오류가 있긴 하지만 설명하기에는 좋은 예 같다. (원 출처의 수정본)

파일 입출력을 비동기 형식으로 지원하는 언어는 내 경험으론 아직 없다. (있을지도 -_-;;;)

실행 결과를 스크린샷으로 올려 볼 까 한다.
Emacs 스크린이라 좀 생소한 이들도 있을지도 모르겠다. 어쨌든 아랫쪽 화면이 쉘 화면으로 실행 결과를 표시해 주고 있다.

'end...' 이라고 가장 마지막에 찍도록 명령한 것이 가장 먼저 찍혀 있다. 대신 readFile이나 writeFile의 경우 코드 상의 순서와는 관계 없이 나중에 실행된 것을 볼 수 있다. (readFile이 null 결과를 돌려준 것은 문제가 있는 코드라는 의미인데 비동기 설명과는 관계 없어서 무시했다)

결국 코드는 내가 부하 직원에 명령 하듯이, 특정 일을 처리하도록 지시하고 결과물을 받아서 처리하는 콜백 함수를 등록해 주는 형식으로 작동한다. 스크립트는 순차적으로 실행되었지만 결과는 순차적이지 않다. 하나의 프로세스로 동작하는 프로그램이 마치 멀티스레드를 이용하듯이 병렬로 처리가 된 결과를 얻게 되었다.

단, 순서는 시스템에 따라 바뀔지도 모른다.

누군가 한 말을 인용해야 겠다.
node.js는 네가 짠 코드 빼고는 모든 것이 비동기(asynchronous)다.

ps. sys.puts는 그냥 화면상에 텍스트를 찍는 루틴이라 비동기가 아니다. 이건 당연한거니 예외로 치자.

댓글 없음 :