카테고리 없음

[번역]Node.js: Difference between spawn and exec of child_process

손혜정 2020. 2. 11. 17:09

원문 : https://www.hacksparrow.com/nodejs/difference-between-spawn-and-exec-of-node-js-child-rocess.html 

 

 

Node.js의 child_process 모듈에는 2가지 method가 있다: spawn(), exec()

무엇을 사용하건간에 시스템에서 다른 program들을 실행시킬 수 있게 해준다.

 

이 두 method의 기능적인 차이와 내 시스템에 어떤걸 써야하는지에 대해 알아보자.

 

일단, 주된 차이점으로 child_process.spawn() 과 child_process.exec()는 반환하는 것이 다르다

 spawn() : stream을 반환

 exec() : buffer를 반환

 

spawn()은, stdout과 stderr 스트림을 포함한 객체를 반환한다. 

stdout을 tab해서, 하위 프로세스가 노드로 보내는 데이터를 읽을 수 있다. 이 외에도 "data","end"등 기타 이벤트가 있다. 주로 많은 양의 데이터를 노드에 반환하는 경우에 적합하다. 

 ex) 이미지 프로세싱, 바이너리 데이터 읽기 등...

 

또한 spawn()은 "asynchronously asynchronous - 비동기식 비동기"다. 즉, 자식 프로세스가 실행되는 즉시 자식 프로세스에서 데이터를 스트림으로 다시 보내기 시작한다.

 

 

exec()는 child process로부터 전체 buffer를 반환한다. 기본 버퍼 사이즈는 200k로 설정되어 있다. 만약 자식 프로세스가 200k를 넘는 용량을 반환하려 할때 error 메세지를 반환 할 것이다. "Error:maxBuffer exceed". 몰론 exec buffer 옵션을 설정을 바꿔줄 수 있다. 하지만 권장하지 않는다. exec는 큰 버퍼를 반환하기 위해 존재하는 것이 아니기 때문에. 따라서 데이터 말고 결과만 반환하고자 할 때 exec를 쓰면 된다.

 

exec()는 "synchronously asynchronous - 동기식 비동기"다. 즉, exec 자체는 비동기지만 자식 프로세스가 종료될 때까지 기다렸다가 버퍼링 된 모든 데이터를 한번에 반환하려 한다. exec의 버퍼 크기가 충분히 크게 설정되지 않으면 "maxBuffer 초과"오류와 함께 실패할것이다.

 

 

**참고로 본문에 spawn()과 exec()의 예제가 있다