2016-09-20 4 views
6

나는 동시성과 병렬성의 차이에 대해 더 많이 살펴 봤다. Rob Pike가 동시성과 병렬성의 차이점에 대해 이야기 한 YouTube에 대한 강연이있었습니다. 그의 대화는 Google Go 언어의 맥락에서 이루어졌습니다. 필자가 이해하는 바에서 동시성은 여러 가지를 처리 ​​할 수있는 디자인이지만 병렬 처리는 동시에 여러 가지를 실제로 실행하는 것입니다.Node.js가 병렬 처리를 지원합니까?

Node.js는 단일 스레드 프로세스로 실행됩니다. 따라서 Node는 콜백 등을 구현하는 방식과 동시성을 지원하지만 태스크의 병렬 실행을 처리 할 수 ​​있습니까? 별도의 프로세서에서 여러 스레드를 실행하도록 설정할 수 있습니까?

답변

4

노드가 Nodejs 코어 API의 패키지 중 하나를 Cluster 또는 child_process 모듈을 통해 "병렬"를 지원할 수있는 답변을

희망. 이 두 모듈 모두 추가 스레드가 아닌 추가 프로세스를 작성합니다.

스레드는 파일에서 읽기와 같이 비동기 작업을 수행하기 위해 구현되고 사용되는 libuv에 의해 풀에서 때때로 생성되고 관리됩니다. 실행중인 Javascript에서 스레드를 명시 적으로 만들 수 없습니다. 당신은 아래의 자원

입니다 세부.

Cluster은 여러 코어에서 서버의 작업 부하를 분산하고 여전히 포트를 공유하도록 사용됩니다. 그러나 Clusterchild_process.fork()을 사용하고 inter-process communication을 통해 통신합니다. Cluster in the Nodejs Core API Docs에 대한 자세한 내용을 볼 수 있습니다.

child_processexec(), spawn() 또는 fork()을 통해 작업을 병렬 처리하는 몇 가지 다른 방법을 제공합니다. 부모 프로세스는 파이프를 통한 프로세스 간 통신을 사용하여 자식 프로세스와 통신 할 수 있습니다.

기본적으로 노드는 the event loop을 활용하고 스레드 관리를 libuv으로 남겨야합니다. 따라서 일반적으로 잠금 및 스레드 안전 조치가 필요한 코드를 작성하는 것이 쉽습니다. 무거운 물건을 들어 올리거나 상당한 양의 막힘 (동기식) 작업이 필요한 작업을 수행해야한다면 child_process을 사용하여 해당 작업을 오프로드 할 수 있습니다. 코어를 통해 웹 응용 프로그램을 수평 확장해야하는 경우 Cluster을 사용하십시오.

+0

메시지를 전달하여 동시에 통신 할 수있는 여러 실행 흐름을 만들려면 최소한 [편도] (https://www.npmjs.com/package/webworker-threads)가 있다는 인상하에있었습니다. 서로. 그렇지 않니? –

+1

@DavidSchwartz, 맞습니다. 그 접근법은'child_process'를 사용하고 부모 프로세스의'child_process.on ('message')'이벤트와 자식의'process.send()'함수로 메시지 전달을 구현할 수 있습니다 방법. 또한 Node.js가 핵심 기능의 일부로 제공하는 것에 대한 나의 대답을 제한하고 잠재적으로 어떤 패키지가 제공 할 수있는 것이 아닌지를 제한하고자했습니다. – peteb

0

내가 실수하지 않는다면, 당신은 멀티 스레딩의 라인을 따라 무언가를 찾고, 동시에 여러 것을 계산할 것입니다.

다중 실행 한 번에
SIMD 멀지 않은 뒤에 노드 구현과, 브라우저에 그것의 방법을 찾기 위해 시작했다. node-simd 또는 MDN SIMD (browsers)을보십시오. SIMD는 아직 실험 중이며 현재 지원되는 CPU에서만 작동합니다 (분명히 모든 CPU에이 기능이있는 것은 아니기 때문에). 그것은 한 번에 여러 가지를 실행, 일반 JS 비교 예는 JS가 될 것 SIMD하기 :

// Normal addition, 4 actions are executed. 
var a = [1, 2, 3, 4]; 
var b = [5, 6, 7, 8]; 
var c = []; 

c[0] = a[0] + b[0]; 
c[1] = a[1] + b[1]; 
c[2] = a[2] + b[2]; 
c[3] = a[3] + b[3]; 
c; // Array[6, 8, 10, 12] 

// SIMD execution - all additions are processed simultaenously through the CPU 
var a = SIMD.Float32x4(1, 2, 3, 4); 
var b = SIMD.Float32x4(5, 6, 7, 8); 
var c = SIMD.Float32x4.add(a,b); 
c; // Float32x4[6, 8, 10, 12] 

멀티 스레딩
를 멀티 스레딩에 관해서, webworkers 지금 잠시 동안 브라우저 환경에 존재했다. 이것은 in this repository처럼 HTML 스펙에 따라 Node에 완전히 포팅되었습니다.
다른 스레드 및 다른 CPU에서 child_process 모듈을 사용하여 자식 프로세스를 이미 실행할 수 있기 때문에 webworkers이 첫 번째 위치에서 노드로 이식 된 이유에 대해서는 good explanation입니다. node-webworker은 각 프로세스가 컨텍스트 내에서 실행되고 자체 node 프로세스에서 실행되므로 훌륭한 모듈입니다. 따라서 노드와 함께 멀티 스레딩이 가능합니다.

다른 CPU에서 다른 프로세스를 실행하려면 node-webworker을 사용하거나 child_process을 사용하여 다른 스레드를 생성하여 다른 CPU 코어와 동시에 개별 작업을 수행하십시오. node-webworker은 익숙한 postMessage API를 사용하여 이벤트를 수신하고 child_processstdin/stdout/stderr을 통해 통신합니다. 질문 :

관련 문제