답변:
스폰은 시스템 명령을 실행하도록 설계된 명령입니다. 스폰을 실행할 때 자체 프로세스에서 실행될 시스템 명령을 보내지 만 노드 프로세스 내에서 더 이상 코드를 실행하지 않습니다. 생성 된 프로세스에 리스너를 추가하여 코드가 생성 된 프로세스와 상호 작용할 수 있지만 새로운 V8 인스턴스는 생성되지 않습니다 (물론 명령이 다른 노드 명령이 아니라면이 경우 포크를 사용해야합니다!) 프로세서에서 하나의 노드 모듈 사본 만 활성화됩니다.
포크는 스폰의 특별한 인스턴스이며 V8 엔진의 새로운 인스턴스를 실행합니다. 즉, 기본적으로 정확히 동일한 노드 코드 기반에서 실행되거나 특정 작업에 대해 다른 모듈에서 여러 작업자를 만들 수 있습니다. 이것은 작업자 풀을 만드는 데 가장 유용합니다. 노드의 비동기 이벤트 모델을 사용하면 머신의 단일 코어를 상당히 효율적으로 사용할 수 있지만 노드 프로세스가 멀티 코어 머신을 사용할 수는 없습니다. 이를 달성하는 가장 쉬운 방법은 단일 프로세서에서 동일한 프로그램의 여러 사본을 실행하는 것입니다.
경험상, 코어 당 1-2 개의 노드 프로세스, 즉 램 클럭 / CPU 클럭 비율이 좋은 머신 또는 I / O가 많은 노드 프로세스 및 CPU 작업량이 적은 노드 프로세스의 경우 이벤트 중단 시간을 최소화합니다. 루프가 새로운 이벤트를 기다리고 있습니다. 그러나 후자의 제안은 미세 최적화이며, 상황이 많은 프로세스 / 코어의 요구에 적합하도록 신중한 벤치마킹이 필요합니다. 머신 / 시나리오에 너무 많은 작업자를 스폰하여 실제로 성능을 저하시킬 수 있습니다.
궁극적으로 스폰에 Node 명령을 보내서 위와 같은 방식으로 스폰을 사용할 수 있습니다. 그러나 포크는 V8 인스턴스 생성 프로세스를 최적화하기 위해 몇 가지 작업을 수행하기 때문에 어리석은 일입니다. 분명히 말하면, 궁극적으로 스폰은 포크를 포함합니다. 포크는이 특정 용도에 가장 적합하고 매우 유용합니다.
http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
TLDR
Spawn
스폰 이 생성 될 때 - 부모 프로세스와 자식 프로세스 사이에 스트리밍 인터페이스 를 만듭니다 .
스트리밍 인터페이스 수단 -바이너리 형식으로 데이터 버퍼링ONE TIME
Fork
때 포크가 생성됩니다 - 그것은 생성 통신 채널 부모와 자식 프로세스 사이를
통신 채널 수단 -메시징
Difference
둘 다 동일한 데이터 전송 을하는 것처럼 보입니다. 아래 차이점을 제외하고
스폰 은 바이너리 / 인코딩 형식의 연속 데이터 버퍼 를 수행 할 때 유용 합니다 (예 : 1GB 비디오 파일 전송, 이미지, 로그 파일)ONE TIME
포크 는 당신이 메시징
예를 들어- JSON
또는 XML
데이터 메시징 을 할 때 유용합니다
Conslusion
스폰 은 빅 데이터 / 파일 / 이미지를 스폰 프로세스에서 상위 프로세스 로 스트리밍 하는 데 사용해야합니다 .
Json / Xml 메시징을 수행하려면 fork를 사용해야합니다.
FORK
하여 데이터의 매우 큰 덩어리가있는 경우로 다른 버퍼를 한 후 사용SPAWN
child_process.spawn 메소드는 주어진 명령으로 새로운 프로세스를 시작합니다. 그것은 다음과 같은 서명이 있습니다-
child_process.spawn(command[, args][, options])
옵션 에 대해 더 읽어보기
spawn () 메소드는 스트림 (stdout & stderr)을 리턴하며 프로세스가 많은 양의 데이터를 리턴 할 때 사용해야합니다. spawn ()은 프로세스가 시작 되 자마자 응답을 받기 시작합니다.
child_process.fork 메소드는 노드 프로세스를 작성하기위한 spawn () 의 특수한 경우입니다 . 그것은 다음과 같은 서명이 있습니다-
child_process.fork(modulePath[, args][, options])
fork 메소드는 일반 ChildProcess 인스턴스에 모든 메소드가있는 것 외에도 내장 된 통신 채널이있는 오브젝트를 리턴합니다.
var child = require('child_process').fork('child.js');
예를 들어 메인 앱에서 사용하면 두 개의 별도 코어가 실행됩니다. child.js (프로세스)에서 무거운 for 루프 를 실행 한다면 본질적으로 child.js를 강화하기 위해 더 많은 코어를 사용하고 있습니까? CPU 사용량이 주요 앱 코어에 영향을 미칩니 까?