nodejs에서 스레드를 만드는 방법


답변:


94

모든 node.js 프로세스는 설계 상 단일 스레드입니다. 따라서 여러 스레드를 얻으려면 여러 프로세스가 있어야합니다 (다른 포스터가 지적했듯이 Node에서 스레드로 작업 할 수있는 기능을 제공하는 링크 할 수있는 라이브러리도 있지만 해당 라이브러리 없이는 그러한 기능이 존재하지 않습니다) . Shawn Vincent의 답변 참조 https://github.com/audreyt/node-webworker-threads )

node.js 문서 http://nodejs.org/api/child_process.html 에 표시된대로 기본 프로세스에서 하위 프로세스를 시작할 수 있습니다 . 예제는이 페이지에서 꽤 훌륭하고 매우 간단합니다.

그런 다음 부모 프로세스는 시작된 모든 프로세스에서 닫기 이벤트를 관찰 한 다음 시작된 다른 프로세스를 강제 종료하여 하나의 실패한 모든 중지 전략을 달성 할 수 있습니다.

참조 : 멀티 코어 머신의 Node.js


프로세스가 한 번에 병렬 및 순차적으로 실행할 수 있습니까?
user87267867

2
자식 프로세스는 부모 프로세스와 독립적입니다. 자체 메모리 공간, PID 및 실행 시간이 있습니다. 순차가 무엇을 의미하는지 확실하지 않지만 예, 병렬로 실행되고 실행을 위해 OS에 의해 별도로 예약됩니다.
Brian

사용자 정의 함수를 자식 프로세스로 호출하는 방법은 무엇입니까?
user87267867 2013-04-04

어떻게 내가) {} 통화 기능 abc 방송 (에 자식 프로세스를 생성 할 수 있습니다
user87267867

2
Huh, 그 라이브러리를 알지 못했지만 Alex Mills 주석에 따라 Node.js에서 스레딩 작업을 수행 할 수있는 것처럼 보입니다. 즉, 다음 질문은해야합니다. . . Node는 스레드와 함께 제공되는 복잡성에서 프로그래머를 해방시키기 위해 처음부터 설계되었지만 I / O 차단에 대해 유사한 유형 성능을 제공합니다. 참조 된 라이브러리를 사용할 수 있다는 사실을 설명하기 위해 내 답변을 편집 할 것입니다.
Brian



9

Napa.js를 사용하여 멀티 스레딩을 얻을 수 있습니다.

https://github.com/Microsoft/napajs

"Napa.js는 V8에 구축 된 다중 스레드 JavaScript 런타임으로, 원래 Bing에서 성능 저하가없는 고도로 반복적 인 서비스를 개발하도록 설계되었습니다. 발전함에 따라 CPU 바인딩 작업에서 Node.js를 보완하는 것이 유용하다는 것을 알게되었습니다. , 여러 V8 분리에서 JavaScript를 실행하고 이들간에 통신 할 수있는 기능이 있습니다. Napa.js는 Node.js 모듈로 노출되며 Node.js 종속성없이 호스트 프로세스에 임베드 될 수도 있습니다. "



3

Node.js에서 실제 멀티 스레딩이 필요 했고 저에게 효과 가 있었던 것은 스레드 패키지였습니다. 자체 Node.js 메시지 루프가있는 다른 프로세스를 생성하므로 서로를 차단하지 않습니다. 설정이 쉽고 설명서를 통해 빠르게 준비하고 실행할 수 있습니다. 메인 프로그램과 워커는 양방향으로 통신 할 수 있으며 필요한 경우 워커 "스레드"를 종료 할 수 있습니다.

멀티 스레딩과 Node.js는 복잡하고 광범위하게 논의되는 주제이기 때문에 특정 요구 사항에 맞는 패키지를 찾는 것이 매우 어려웠습니다 . 기록을 위해 이들은 나를 위해 작동하지 않았습니다 .

  • small-worker는 작업자 생성을 허용했지만 동일한 메시지 루프를 공유하는 것처럼 보였습니다 (하지만 내가 뭔가 잘못했을 수도 있습니다. 스레드 가 더 많은 문서를 통해 실제로 여러 프로세스를 사용 했으므로 작동 할 때까지 계속 진행했습니다)
  • webworker-threadsrequire내가 필요한 작업자에서 -ing 모듈을 허용하지 않았습니다.

그리고 내가 진짜 멀티 스레딩이 필요한 이유를 묻는 사람들을 위해 : Raspberry Pi 및 인터럽트와 관련된 애플리케이션의 경우. 한 스레드는 이러한 인터럽트를 처리하고 다른 스레드는 데이터 저장을 처리합니다.


1
이 답변에 대한 위대한 생각에 감사드립니다!
MLissCetrus

3

nodejs 10.5.0 릴리스는 Node.js의 멀티 스레딩을 발표했습니다 . 이 기능은 아직 실험 단계입니다. 현재 사용 가능한 새로운 worker_threads 모듈이 있습니다.

Node.js v10.5.0 이상 을 실행하면 작업자 스레드 사용을 시작할 수 있지만 이것은 실험적인 API 입니다. 기본적으로 사용할 수 없습니다 . Node.js를 호출 할 때 --experimental-worker 를 사용하여 활성화해야합니다  .

다음은 버전 12.3.1 에서 테스트 된 ES6worker_threads가 활성화 된 예입니다.

//package.json

  "scripts": {
  "start": "node  --experimental-modules --experimental- worker index.mjs"
  },

이제 worker_threads 에서 Worker를 가져와야 합니다. 참고 : ES6 지원을 위해 확장자'.mjs'인 js 파일 을 선언해야합니다 .

//index.mjs
import { Worker } from 'worker_threads';

const spawnWorker = workerData => {
    return new Promise((resolve, reject) => {
        const worker = new Worker('./workerService.mjs', { workerData });
        worker.on('message', resolve);
        worker.on('error', reject);
        worker.on('exit', code => code !== 0 && reject(new Error(`Worker stopped with 
        exit code ${code}`)));
    })
}

const spawnWorkers = () => {
    for (let t = 1; t <= 5; t++)
        spawnWorker('Hello').then(data => console.log(data));
}

spawnWorkers();

마지막으로 workerService.mjs를 생성합니다.

//workerService.mjs
import { workerData, parentPort, threadId } from 'worker_threads';

// You can do any cpu intensive tasks here, in a synchronous way
// without blocking the "main thread"
parentPort.postMessage(`${workerData} from worker ${threadId}`);

산출:

npm 실행 시작

Hello from worker 4
Hello from worker 3
Hello from worker 1
Hello from worker 2
Hello from worker 5

2
이 기사가 블로그 입니까 : blog.logrocket.com/… ?
serv-inc

아뇨 .. 아니에요 .. 제 시간에 다시 언급 했어요.
priyeshdkr



0

당신이 찾고있는 수 있습니다 Promise.race(기본 I / O 경주 솔루션이 아닌 스레드)

사용자 (또는이 질문을 검색하는 다른 사용자)가 실패를 방지하고 I / O 작업 비용을 피하기 위해 스레드를 경쟁한다고 가정하면 이는 스레드를 사용하지 않는 간단하고 기본적인 방법입니다. 노드는 단일 스레드로 설계되었으므로 (이벤트 루프 조회) 가능하면 스레드를 사용하지 마십시오. 내 가정이 맞다면 (링크의 예) Promise.race와 함께 사용 하는 것이 좋습니다 setTimeout. 이 전략을 사용하면 각각 몇 가지 I / O 작업을 시도하고 오류가있는 경우 (그렇지 않으면 시간 초과) 약속을 거부하는 약속 목록을 경쟁하게됩니다. 이 Promise.race진술은 첫 번째 해결 / 거부 후에도 계속되며, 이는 귀하가 원하는 것 같습니다. 이것이 누군가를 돕기를 바랍니다!


2
이것은 스레드와 관련이 없습니다. 그들은 모두 같은 스레드에서 실행됩니다.
Evan Carroll

@EvanCarroll-내가 충분히 명확하지 않다는 것을 알려 주셔서 감사합니다. 나는 누군가가 스레드 경주를 찾는 이유에 대한 가정으로 시작했고 이것이 Node의 이벤트 루프에서 promise를 사용한다고 언급했습니다. 다른 언어에서 왔기 때문에 스레드가 수행하는 작업을 수행하고 싶지만 아직 이벤트 루프 또는 약속에 익숙하지 않을 수 있습니다. 그것이 당신의 목표라면 그것을 달성하는 더 간단한 방법이 있음을 주목하고 싶었습니다. 스레드를 사용하지 않는다는 괄호를 추가했습니다. 문제가 해결되면 알려주세요.
smileham

또한 OPs 기준에 응답하는 것 같습니다. "다른 모든 스레드 사이에 어떤 방법이 실패하면 죽여야합니다", 그래서 관련성이 있다고 생각했습니다.
smileham

Promise.race는 모든 promise를 순차적으로 실행하여 비동기 작업의 경우 하나에서 다른 것으로 전환합니다 (또는 비동기 함수의 경우 대기).
Nagabhushan Baddi

0

Node.js는 스레딩을 사용하지 않습니다. 발명가에 따르면 이것이 핵심 기능입니다. 발명 당시 스레드는 느리고 문제가 많으며 어려웠습니다. Node.js는 효율적인 단일 코어 대안에 대한 조사의 결과로 만들어졌습니다. 대부분의 Node.js 애호가들은 스레드가 지난 50 년 동안 개선되지 않은 것처럼 여전히 오래된 주장을 인용합니다.

아시다시피 Node.js는 JavaScript를 실행하는 데 사용됩니다. JavaScript 언어도 수년에 걸쳐 개발되었습니다. 이제 여러 코어를 사용하는 방법이 있습니다. 즉, 스레드가 수행하는 작업입니다. 따라서 JavaScript의 발전을 통해 애플리케이션에서 몇 가지 멀티 코어 멀티 태스킹을 수행 할 수 있습니다. user158은 Node.js가 약간 놀고 있다고 지적합니다. 나는 그것에 대해 아무것도 모른다. 그러나 Node.js가 JavaScript가 제공해야하는 것을 승인 할 때까지 기다리는 이유는 무엇입니까?

Node.js 멀티 스레딩 대신 자바 스크립트 멀티 스레딩을위한 Google. Web Workers, Promise 및 기타 사항에 대해 알아볼 수 있습니다.

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