node.js 자식 프로세스-스폰과 포크의 차이점


141

이것은 기본적인 질문처럼 보이지만 문서를 찾을 수 없습니다.

node.js 프로세스의 분기 및 생성의 차이점은 무엇입니까? 나는 포크가 스폰의 특별한 경우라는 것을 읽었지만 각각의 사용에 대한 다른 유스 케이스 / 반복은 무엇입니까?

답변:


216

스폰은 시스템 명령을 실행하도록 설계된 명령입니다. 스폰을 실행할 때 자체 프로세스에서 실행될 시스템 명령을 보내지 만 노드 프로세스 내에서 더 이상 코드를 실행하지 않습니다. 생성 된 프로세스에 리스너를 추가하여 코드가 생성 된 프로세스와 상호 작용할 수 있지만 새로운 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


@ChrisCM, var child = require('child_process').fork('child.js');예를 들어 메인 앱에서 사용하면 두 개의 별도 코어가 실행됩니다. child.js (프로세스)에서 무거운 for 루프 를 실행 한다면 본질적으로 child.js를 강화하기 위해 더 많은 코어를 사용하고 있습니까? CPU 사용량이 주요 앱 코어에 영향을 미칩니 까?
NiCk Newman

2
다른 작업에는 영향을주지 않고 CPU에서 어떤 작업도 수행 할 수 없습니다. 스케줄링, 공유 캐시 사용량, BUS 트래픽 등. 그러나 별도의 코어를 활용하고 기본 실행 루프는 거의 영향을받지 않아야합니다. 마찬가지로 두 개의 프로세스가 동일한 단일 코어 프로세서에서 실행될 것으로 예상되는 심각한 부정적인 영향은 아닙니다. 이 시점에서 운영 체제 및 하드웨어 설정은 실제로 최적화하는 데 달려 있습니다. 설정이 다르면 다른 결과가 나올 수 있습니다.
ChrisCM

@ChrisCM 그래, 전역 MonsterLoop을 사용하여 몬스터 위치를 동기화하고 반복하는 객체는 최대 5,000 키가 될 수 있습니다. 매 2 초마다 반복하고 CPU (주 게임 하나)에서 수백 개의 메모리 사용량을 잘라내는 것처럼 보입니다. 차라리 루프 아웃하고 코어 당 xx 번 실행되도록하는 대신이 방법을 사용하고 싶습니다 ... 통찰력에 대한 타이 ~ 이제 Redis 또는 내부 IPC를 사용 해야하는지 모르겠습니다. P
NiCk Newman

2
"이유"를 설명해 주셔서 감사합니다.이 글을 읽을 때까지 읽은 모든 게시물은 간단한 설명 부분을 놓쳤습니다.
aaaaaa

@ChrisCM 당신은 "..하지만 노드 프로세스 내에서 더 이상 코드를 실행하지 않습니다 .." 메인 스레드가 대기 중이며 아무것도 처리하지 않는다는 것을 의미합니까? YES 인 경우 여기에서 스폰 사용의 용도는 무엇입니까?
Abhi

9

TLDR

Spawn

스폰 이 생성 될 때 - 부모 프로세스와 자식 프로세스 사이에 스트리밍 인터페이스 를 만듭니다 .

스트리밍 인터페이스 수단 -바이너리 형식으로 데이터 버퍼링ONE TIME

Fork

포크가 생성됩니다 - 그것은 생성 통신 채널 부모와 자식 프로세스 사이를

통신 채널 수단 -메시징

Difference

둘 다 동일한 데이터 전송 을하는 것처럼 보입니다. 아래 차이점을 제외하고

스폰바이너리 / 인코딩 형식의 연속 데이터 버퍼 를 수행 할 때 유용 합니다 (예 : 1GB 비디오 파일 전송, 이미지, 로그 파일)ONE TIME

포크 는 당신이 메시징 예를 들어- JSON또는 XML데이터 메시징 을 할 때 유용합니다

Conslusion

스폰 은 빅 데이터 / 파일 / 이미지를 스폰 프로세스에서 상위 프로세스 로 스트리밍 하는 데 사용해야합니다 .

Json / Xml 메시징을 수행하려면 fork를 사용해야합니다.

  • 예를 들어 부모로부터 10 개의 포크 프로세스가 생성 되었다고 가정합니다.
  • 각 프로세스는 일부 작업을 수행합니다.
  • 작업을 완료하는 각 프로세스는 부모 ' 프로세스 no.4 완료 ', ' 프로세스 no.8 완료 '에 메시지를 보냅니다.

부모에서 자식으로 그리고 파일 내부에서 데이터를 연속 로깅하는 것은 어떻습니까?
Esqarrouth

1
@Esqarrouth이면 연속 스트림인지 메시지인지 식별해야합니다. 그리고 당신은 단어 "연속 loging"내가 예는 다음 사용하는 경우, u는 아이에게 로그 (JSON)에 wrting됩니다 믿고 사용 FORK하여 데이터의 매우 큰 덩어리가있는 경우로 다른 버퍼를 한 후 사용SPAWN
비제이을

5
  • spawnchild_process.spawn 은 주어진 명령으로 새로운 프로세스를 시작합니다.
  • fork - child_process.fork 메소드는 자식 프로세스를 생성하기위한 spawn () 의 특별한 경우입니다 .

spawn () 메소드

child_process.spawn 메소드는 주어진 명령으로 새로운 프로세스를 시작합니다. 그것은 다음과 같은 서명이 있습니다-

child_process.spawn(command[, args][, options])

옵션 에 대해 더 읽어보기

spawn () 메소드는 스트림 (stdout & stderr)을 리턴하며 프로세스가 많은 양의 데이터를 리턴 할 때 사용해야합니다. spawn ()은 프로세스가 시작 되 자마자 응답을 받기 시작합니다.

fork () 메소드

child_process.fork 메소드는 노드 프로세스를 작성하기위한 spawn () 의 특수한 경우입니다 . 그것은 다음과 같은 서명이 있습니다-

 child_process.fork(modulePath[, args][, options])

fork 메소드는 일반 ChildProcess 인스턴스에 모든 메소드가있는 것 외에도 내장 된 통신 채널이있는 오브젝트를 리턴합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.