nodejs.org/dist/latest-v14.x/docs/api/child_process.html
* 노드 14.15.4 LTS 버전을 기반으로 설명드립니다.
노드에서 다른 프로그램을 실행하고 싶거나 명령어를 수행하고 싶을 때 child_process 내장 모듈을 사용합니다.
왜 이름이 child_process이냐면, 노드가 가동되는 프로세스 외에 별도의 프로세스를 가동하여 명령을 수행하고 결과값을 노드 프로세스에 돌려주기 때문입니다.
자, 여기서 프로그램, 프로세스, 스레드에 대한 CS적 지식이 요구됩니다.
thread_workers를 이용한 것은 한 프로세스 내에 존재하는 여러 스레드를 동시에 사용하는 겁니다.
child_process는 프로세스를 하나 더 생성하는 겁니다.
* 노드의 이벤트 루프는 싱글 스레드이다 => 프로세스 내부의 한 스레드만 이용한다.
* 범위에서 보자면 thread_workers는 한 스레드 내부에서 일어나는 일인 반면 child_process는 프로세스 레벨에서 이루어지는 것입니다.
darrengwon.tistory.com/763?category=907676
구체적인 사용방법은 간단합니다.
아래와 같이 윈도우 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")
'Node, Nest, Deno > 🚀 Node.js (+ Express)' 카테고리의 다른 글
Stream 사용하기 (0) | 2021.01.29 |
---|---|
fs 모듈로 Binary 파일 처리부터 Buffer와 Stream까지 (3) | 2021.01.28 |
node.js 서비스 로그 관리 : pm2 log management (0) | 2021.01.11 |
nginx(reverse-proxy), node에서 이미지 업로드 중 request entity too large 에러 (0) | 2020.12.08 |
express 보안 우수 사례를 참고한 보안 강화 (0) | 2020.11.23 |