한 번에 여러 메서드를 실행하기위한 스레드를 만드는 방법이 있습니까?
이렇게하면 다른 모든 스레드 사이에 어떤 메서드가 실패하면 종료됩니다.
한 번에 여러 메서드를 실행하기위한 스레드를 만드는 방법이 있습니까?
이렇게하면 다른 모든 스레드 사이에 어떤 메서드가 실패하면 종료됩니다.
답변:
모든 node.js 프로세스는 설계 상 단일 스레드입니다. 따라서 여러 스레드를 얻으려면 여러 프로세스가 있어야합니다 (다른 포스터가 지적했듯이 Node에서 스레드로 작업 할 수있는 기능을 제공하는 링크 할 수있는 라이브러리도 있지만 해당 라이브러리 없이는 그러한 기능이 존재하지 않습니다) . Shawn Vincent의 답변 참조 https://github.com/audreyt/node-webworker-threads )
node.js 문서 http://nodejs.org/api/child_process.html 에 표시된대로 기본 프로세스에서 하위 프로세스를 시작할 수 있습니다 . 예제는이 페이지에서 꽤 훌륭하고 매우 간단합니다.
그런 다음 부모 프로세스는 시작된 모든 프로세스에서 닫기 이벤트를 관찰 한 다음 시작된 다른 프로세스를 강제 종료하여 하나의 실패한 모든 중지 전략을 달성 할 수 있습니다.
참조 : 멀티 코어 머신의 Node.js
또한 Node.js 내에서 네이티브 스레딩을 수행하기위한 라이브러리가 하나 이상 있습니다. node-webworker-threads
https://github.com/audreyt/node-webworker-threads
이것은 기본적으로 node.js 용 Web Worker 브라우저 API 를 구현합니다.
Node 10.5부터는 다중 스레딩 지원 이 있지만 실험적 입니다. 곧 안정되기를 바랍니다.
다음 리소스 확인 :
업데이트 :
Node v11.7.0 부터는 --experimental-worker
플래그 를 사용할 필요가 없습니다 .
Napa.js를 사용하여 멀티 스레딩을 얻을 수 있습니다.
https://github.com/Microsoft/napajs
"Napa.js는 V8에 구축 된 다중 스레드 JavaScript 런타임으로, 원래 Bing에서 성능 저하가없는 고도로 반복적 인 서비스를 개발하도록 설계되었습니다. 발전함에 따라 CPU 바인딩 작업에서 Node.js를 보완하는 것이 유용하다는 것을 알게되었습니다. , 여러 V8 분리에서 JavaScript를 실행하고 이들간에 통신 할 수있는 기능이 있습니다. Napa.js는 Node.js 모듈로 노출되며 Node.js 종속성없이 호스트 프로세스에 임베드 될 수도 있습니다. "
Rx를 사용하는 경우 rxjs-cluster에 플러그인하여 작업을 병렬 실행으로 분할하는 것이 다소 간단합니다. (면책 조항 : 저자입니다)
Node.js에서 실제 멀티 스레딩이 필요 했고 저에게 효과 가 있었던 것은 스레드 패키지였습니다. 자체 Node.js 메시지 루프가있는 다른 프로세스를 생성하므로 서로를 차단하지 않습니다. 설정이 쉽고 설명서를 통해 빠르게 준비하고 실행할 수 있습니다. 메인 프로그램과 워커는 양방향으로 통신 할 수 있으며 필요한 경우 워커 "스레드"를 종료 할 수 있습니다.
멀티 스레딩과 Node.js는 복잡하고 광범위하게 논의되는 주제이기 때문에 내 특정 요구 사항에 맞는 패키지를 찾는 것이 매우 어려웠습니다 . 기록을 위해 이들은 나를 위해 작동하지 않았습니다 .
require
내가 필요한 작업자에서 -ing 모듈을 허용하지 않았습니다.그리고 내가 진짜 멀티 스레딩이 필요한 이유를 묻는 사람들을 위해 : Raspberry Pi 및 인터럽트와 관련된 애플리케이션의 경우. 한 스레드는 이러한 인터럽트를 처리하고 다른 스레드는 데이터 저장을 처리합니다.
nodejs 10.5.0 릴리스는 Node.js의 멀티 스레딩을 발표했습니다 . 이 기능은 아직 실험 단계입니다. 현재 사용 가능한 새로운 worker_threads 모듈이 있습니다.
Node.js v10.5.0 이상 을 실행하면 작업자 스레드 사용을 시작할 수 있지만 이것은 실험적인 API 입니다. 기본적으로 사용할 수 없습니다 . Node.js를 호출 할 때 --experimental-worker 를 사용하여 활성화해야합니다 .
다음은 버전 12.3.1 에서 테스트 된 ES6 및 worker_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
프로젝트 상태에 대해 잘 모르겠지만 이제 https://github.com/xk/node-threads-a-gogo 도 있습니다 .
당신이 찾고있는 수 있습니다 Promise.race
(기본 I / O 경주 솔루션이 아닌 스레드)
사용자 (또는이 질문을 검색하는 다른 사용자)가 실패를 방지하고 I / O 작업 비용을 피하기 위해 스레드를 경쟁한다고 가정하면 이는 스레드를 사용하지 않는 간단하고 기본적인 방법입니다. 노드는 단일 스레드로 설계되었으므로 (이벤트 루프 조회) 가능하면 스레드를 사용하지 마십시오. 내 가정이 맞다면 (링크의 예) Promise.race
와 함께 사용 하는 것이 좋습니다 setTimeout
. 이 전략을 사용하면 각각 몇 가지 I / O 작업을 시도하고 오류가있는 경우 (그렇지 않으면 시간 초과) 약속을 거부하는 약속 목록을 경쟁하게됩니다. 이 Promise.race
진술은 첫 번째 해결 / 거부 후에도 계속되며, 이는 귀하가 원하는 것 같습니다. 이것이 누군가를 돕기를 바랍니다!
Node.js는 스레딩을 사용하지 않습니다. 발명가에 따르면 이것이 핵심 기능입니다. 발명 당시 스레드는 느리고 문제가 많으며 어려웠습니다. Node.js는 효율적인 단일 코어 대안에 대한 조사의 결과로 만들어졌습니다. 대부분의 Node.js 애호가들은 스레드가 지난 50 년 동안 개선되지 않은 것처럼 여전히 오래된 주장을 인용합니다.
아시다시피 Node.js는 JavaScript를 실행하는 데 사용됩니다. JavaScript 언어도 수년에 걸쳐 개발되었습니다. 이제 여러 코어를 사용하는 방법이 있습니다. 즉, 스레드가 수행하는 작업입니다. 따라서 JavaScript의 발전을 통해 애플리케이션에서 몇 가지 멀티 코어 멀티 태스킹을 수행 할 수 있습니다. user158은 Node.js가 약간 놀고 있다고 지적합니다. 나는 그것에 대해 아무것도 모른다. 그러나 Node.js가 JavaScript가 제공해야하는 것을 승인 할 때까지 기다리는 이유는 무엇입니까?
Node.js 멀티 스레딩 대신 자바 스크립트 멀티 스레딩을위한 Google. Web Workers, Promise 및 기타 사항에 대해 알아볼 수 있습니다.