본문으로 바로가기

nodejs.org/dist/latest-v14.x/docs/api/child_process.html

 

Child process | Node.js v14.15.4 Documentation

Child process# Source Code: lib/child_process.js The child_process module provides the ability to spawn subprocesses in a manner that is similar, but not identical, to popen(3). This capability is primarily provided by the child_process.spawn() function: c

nodejs.org

 

* 노드 14.15.4 LTS 버전을 기반으로 설명드립니다.

 

노드에서 다른 프로그램을 실행하고 싶거나 명령어를 수행하고 싶을 때 child_process 내장 모듈을 사용합니다.

왜 이름이 child_process이냐면, 노드가 가동되는 프로세스 외에 별도의 프로세스를 가동하여 명령을 수행하고 결과값을 노드 프로세스에 돌려주기 때문입니다.

 

자, 여기서 프로그램, 프로세스, 스레드에 대한 CS적 지식이 요구됩니다.

thread_workers를 이용한 것은 한 프로세스 내에 존재하는 여러 스레드를 동시에 사용하는 겁니다.

child_process는 프로세스를 하나 더 생성하는 겁니다.

 

* 노드의 이벤트 루프는 싱글 스레드이다 => 프로세스 내부의 한 스레드만 이용한다.

* 범위에서 보자면 thread_workers는 한 스레드 내부에서 일어나는 일인 반면 child_process는 프로세스 레벨에서 이루어지는 것입니다.

darrengwon.tistory.com/763?category=907676

 

프로그램, 프로세스, 스레드, 멀티스레드

노드가 싱글 스레드이기 때문에 가급적 동기적으로 함수를 짜서는 안된다는 것은 노드를 다루면 처음에 배우는 내용이다. 도대체 그 '스레드'가 무엇인지 알기 위해서는 프로그램 => 프로세스 =>

darrengwon.tistory.com

 

구체적인 사용방법은 간단합니다.

아래와 같이 윈도우 cmd에서 사용하는 명령어를 별도의 프로세스에서 실행시키고, 표준 출력을 버퍼 형태로 받아와 출력할 수 있습니다.

const exec = require("child_process").exec;

// 윈도우 기반 명령 프롬프트 명령어인 cd
const process = exec("cd");

// 표준 출력
process.stdout.on("data", function (data) {
  console.log(data.toString()); // 버퍼 형태로 전달됩니다.
});

// 표준 에러
process.stderr.on("data", function (data) {
  console.error(data.toString()); // 버퍼 형태로 전달됩니다.
});

 

 

python을 실행하여 그 출력물을 node에 전달하려면 어떻게 해야 할까요?

 

여기서는 exec가 아니라 spawn(저글링 소환도 아니고...)을 사용합니다.

exec은 셸을 실행해서 명령어를 수행하고, spawn은 새로운 프로세스를 띄우면서 명령어를 실행합니다.

 

* 실제 python과 js를 같이 사용할 경우는 지금까지 경험으로는 별로 없었습니다.

1) 크롤러 => csv 저장 => node에서 읽어오기

2) tensorflow.py로 모델 학습 후 json으로 파라미터 저장 => node에서 json을 단순히 읽어와서 사용하기

이 정도였던 것 같습니다.

 

const spawn = require("child_process").spawn;

var process = spawn("python", ["main.py"]);

process.stdout.on("data", function (data) {
  console.log(data.toString());
}); // 실행 결과

process.stderr.on("data", function (data) {
  console.error(data.toString());
}); // 실행 >에러
for i in range(1, 4):
    print(f"{i} iterate")

darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체