JavaScript는 본질적으로 단일 스레드 짐승으로 설계되었습니다. 그러나 컴퓨팅의 거친 환경에서는 '멀티프로세싱' 및 '멀티코어 프로세서'로 알려진 포식자가 길들여지기를 기다리고 있으며 코드 실행을 전례 없는 속도로 향상시킬 준비가 되어 있습니다. 💪🚀
나는 감히 이 정글에 발을 들여놓아 내 코드를 궁극적인 생존 테스트에 적용했고 놀라운 결과를 얻었습니다. 🏆 이제 이 흥미진진한 탐구에 여러분도 동참할 차례입니다. 우리는 흥미로운 코드 예제로 무장하고 내 실험의 놀라운 성과에 횃불🔦을 비추면서 Node.js의 다중 처리 의 수수께끼를 깊이 파고들 것입니다. 🍎🍏
멀티프로세싱의 마법을 통해 JavaScript 성능을 극대화하는 아드레날린이 넘치는 모험을 떠날 준비를 하세요! 우리가 매혹적인 고옥탄 코딩 영역으로 곧 진입할 예정이므로 버클을 채우고 마음의 준비를 하십시오.
너무 깊이 모험하기 전에 몇 가지 신뢰할 수 있는 도구를 갖추도록 합시다. 우리는 종종 힘든 계산 작업을 시뮬레이션하기 위해 몇 가지 보조 기능을 만들 것입니다. utils.js
라는 파일이라는 새로운 아티팩트를 만들고 거기에 이러한 필수 주문을 새겨 보겠습니다.
// utils.js function generateRandomData(size) { const data = []; for (let i = 0; i < size; i++) { data.push(Math.random()); } return data; } function processData(data) { // performs some calculations on the array // to simulate high resource intensity let sum = 0; for (let num of data) { for (let j = 0; j < 1000000; j++) { sum += Math.sqrt(num); } } return sum; } module.exports = { generateRandomData, processData, };
단일 스레드에서의 실행은 문제 해결에 대한 열심히 노력하고 안정적인 접근 방식을 나타냅니다. 단일 스레드 버전의 스크립트는 시각적으로 다음과 같이 설명할 수 있습니다. 단일 스레드 버전의 코드는 매우 간단합니다. 우리는 데이터를 생성하고 처리를 위해 보냅니다.
// sync.js const { generateRandomData, processData } = require("./utils"); const data = generateRandomData(30000); console.time("single-thread. Time:"); processData(data); console.timeEnd("single-thread. Time:");
node sync.js
명령을 사용하여 스크립트를 실행합니다.
우리는 기다리고... 기다리고... 기다리고...
그리고 그 모든 기다림 끝에 우리는 스크립트의 실행 시간을 나타내는 메시지를 받습니다.
single-thread. Time:: 25.888s
이 접근 방식은 대부분의 경우에 적합합니다. 그런데 한 가지 문제가 있습니다. 올바른 마음으로 기다림의 기술을 좋아하는 사람이 누구입니까? 이 고통스러운 지연을 극복하려면 컴퓨터의 모든 화력을 활용해야 합니다! 결국, 대부분의 최신 컴퓨터에는 단일 CPU 코어 이상이 탑재되어 있습니다!
그렇다면 숫자를 처리하고 코드 실행을 과급 할 수 있는 추가 코어를 왜 유휴 상태로 두어야 합니까? 이제 잠자는 거인을 밝히고 멀티프로세싱의 강력한 성능을 발휘할 시간입니다! 뛰어들어보자!
다중 처리 접근 방식을 채택함으로써 CPU의 여러 코어를 활용하여 스크립트 성능을 몇 배 향상시킬 수 있습니다. 다중 처리된 코드의 작업 프로세스는 이 다이어그램으로 시각화할 수 있습니다.
본질적으로 우리는 단순히 대규모 데이터 세트를 세그먼트로 분할하고 처리를 위해 각 세그먼트를 개별 CPU 코어에 할당하는 것입니다.
multi-process.js
라는 파일을 만들고 다음 콘텐츠로 채웁니다.
// multi-process.js const childProcess = require("child_process"); const utils = require("./utils"); const data = utils.generateRandomData(30000); const chunkSize = Math.ceil(data.length / 4); const chunks = []; for (let i = 0; i < 4; i++) { const start = i * chunkSize; const end = start + chunkSize; chunks.push(data.slice(start, end)); } console.time("multiProcessed"); const workers = []; let results = []; // result collection array for (let i = 0; i < chunks.length; i++) { const worker = childProcess.fork("./worker.js"); // pass its number and data to the workflow worker.send({ workerNumber: i, data: chunks[i] }); workers.push( new Promise((resolve, reject) => { worker.on("message", (result) => { results.push(result); // add the result to the result array resolve(); }); worker.on("error", reject); worker.on("exit", (code) => { if (code !== 0) { reject(new Error(`Worker stopped with exit code ${code}`)); } }); }) ); } Promise.all(workers) .then(() => { console.timeEnd("multiProcessed"); console.log("Processing results:", results); }) .catch((err) => console.error(err));
이 코드는 Node.js의 다중 처리 데이터 처리 교향곡에서 단일 작업자 프로세스의 조정을 보여줍니다.
간단히 말해서 현재 상황은 다음과 같습니다.
작업자는 process.on('message')
를 통해 기본 프로세스로부터 데이터와 해당 번호를 받습니다.
processData
함수는 이 작업자에게 할당된 데이터 부분에 대한 계산을 수행합니다.
결과는 `process.send()`를 통해 메인 프로세스로 다시 전송됩니다.
작업자는 process.exit()
를 통해 코드 0으로 종료됩니다.
node multi-process.js
명령을 사용하여 스크립트를 실행합니다.
터보 부스트를 위해 꽉 잡아라...
그리고 우리는 코드가 5초 만에 작동했다는 결론을 얻었습니다!
Worker 0 started Worker 1 started Worker 2 started Worker 3 started ==================== Worker 1 finished ==================== Worker 2 finished ==================== Worker 3 finished ==================== Worker 0 finished multiProcessed: 5.266s Processing results: [ 4971422688.053512, 4989646323.157899, 4999088030.661542, 5008034869.924775 ]
우리 스크립트는 4배 더 빠르게 작동했습니다! 정말 대단하지 않나요?
나는 열렬한 호기심을 가지고 4코어 프로세서가 장착된 컴퓨터에서 두 스크립트를 모두 실행하면서 마법이 펼쳐지는 것을 지켜보았습니다.
우리의 단일 스레드 스크립트인 솔로 아티스트는 25.8초 만에 데이터를 부지런히 처리했습니다.
강력한 팀, 멀티 스레드 스크립트로 단 5.2초 만에 성공했습니다!
계산 속도를 4배 이상 향상시키는 멀티프로세싱의 강력한 성능을 확인하세요!
이러한 뚜렷한 대조는 멀티프로세싱이 어떻게 기계의 계산 능력을 대폭 증폭시키고 실행 시간을 단축할 수 있는지를 강조합니다.
우리의 스릴 넘치는 탐구는 다중 처리가 Node.js의 계산 작업을 어떻게 가속화할 수 있는지에 대한 생생한 그림을 그립니다. 모든 단일 프로세서 코어에 코드를 적용하면 걷기에서 순간 이동으로 전환하는 것과 유사한 성능 향상이 가능합니다!
코딩 화살통에 이 화살표를 추가하고 프로젝트에서 이 접근 방식을 실험해 보는 것은 확실히 가치가 있습니다. 그리고 Node.js에 작업자 스레드가 등장하면서 다중 처리 구현이 쉬워졌습니다.
이 글을 읽으면서 아드레날린이 분출되시나요? 아래 댓글로 Node.js의 멀티프로세싱에 대한 여러분의 모험을 자유롭게 공유해 주세요! 계속해서 고속 코딩의 신비를 함께 풀어봅시다.