>  기사  >  웹 프론트엔드  >  Node.js의 멀티스레딩 및 멀티프로세싱에 대한 심층 분석

Node.js의 멀티스레딩 및 멀티프로세싱에 대한 심층 분석

青灯夜游
青灯夜游앞으로
2020-08-31 09:55:192619검색

Node.js의 멀티스레딩 및 멀티프로세싱에 대한 심층 분석

Node.js는 기본적으로 단일 스레드이지만 백그라운드에서 여러 스레드를 사용하여 비동기 코드를 실행할 수 있는 무료 크로스 플랫폼 JavaScript 런타임 환경입니다.

Node.js의 비차단 특성으로 인해 서로 다른 스레드는 먼저 이벤트 루프에 위임되는 서로 다른 콜백을 실행합니다. Node.js 런타임은 이 모든 것을 처리합니다. [동영상 튜토리얼 추천: node js 튜토리얼]

NodeJS를 사용하는 이유는 무엇인가요?

JavaScript는 원래 웹 브라우저에서만 실행되는 단일 스레드 프로그래밍 언어로 구축되었습니다. 이는 프로세스 내에서 주어진 시간에 하나의 명령 세트만 실행할 수 있음을 의미합니다.

현재 코드 블록의 실행이 완료된 후에만 다음 코드 블록으로 이동하세요. 그러나 JavaScript의 단일 스레드 특성으로 인해 구현이 쉽습니다.

처음에 JavaScript는 웹 사이트에 소량의 상호 작용을 추가하는 데만 사용되었습니다. 따라서 멀티스레딩이 필요하지 않습니다. 그러나 시대가 변하고 사용자의 요구 사항은 더욱 까다로워졌으며 JavaScript는 "웹에서 가장 인기 있는 프로그래밍 언어"가 되었습니다.

요즘 멀티스레딩이 보편화되고 있습니다. JavaScript는 단일 스레드 언어이므로 다중 스레드를 구현할 수 없습니다. 다행히도 이 경우 Node.js라는 훌륭한 솔루션이 있습니다.

Node.js 프레임워크JavaScript 런타임 환경(특히 JavaScript)의 일반적인 인기 덕분에 프레임워크가 부족하지 않습니다. 이 기사를 계속하기 전에 Node.js에 대한 몇 가지 중요한 사항을 이해하겠습니다.

  1. 보내기 기능을 사용하여 하위 프로세스에서 다른 하위 프로세스 및 기본 프로세스로 메시지를 전달할 수 있습니다.
  2. 여러 프로세스 포크 지원
  3. 기본 프로세스 및 하위 프로세스 사이에 상태가 공유되지 않습니다

프로세스를 분기해야 하는 이유는 무엇입니까?

두 가지 경우에 프로세스를 분기해야 합니다.

  1. 작업을 다른 프로세스에 위임하여 속도를 높이려면
  2. 메모리를 확보하고 단일 프로세스를 언로드하기 위해

데이터를 하위 프로세스로 보내거나 다시 보낼 수 있습니다.

Node.js 방식

Node.js는 두 가지 유형의 스레드를 사용합니다.

  1. 메인 스레드는 이벤트 루프를 통해 처리됩니다.
  2. 작업자 풀에는 많은 보조 스레드가 있습니다.

이벤트 루프가 담당합니다. 콜백이나 함수를 가져오고 향후 실행을 위해 등록합니다. 올바른 JavaScript 코드와 동일한 스레드에서 실행됩니다. JavaScript 작업이 스레드를 차단하면 이벤트 루프도 차단됩니다.

작업 풀은 다양한 스레드를 생성하고 처리하는 실행 모델입니다. 작업을 동기적으로 실행한 다음 결과를 이벤트 루프에 반환하고 마지막으로 이벤트 루프가 결과를 콜백에 제공합니다.

요약하자면 작업자 풀은 비동기 I/O 작업, 즉 시스템 디스크 및 네트워크와의 상호 작용을 담당합니다. fs 및 crypto와 같은 모듈은 작업자 풀을 사용하는 주요 모듈입니다.

작업자 풀이 libuv 라이브러리에 구현되었기 때문에 Node.js는 JS와 C++ 간의 내부 통신에 약간의 지연이 있습니다. 하지만 거의 눈에 띄지 않습니다.

복잡한 작업을 동기식으로 수행해야 하는 요구 사항이 발생하기 전까지는 모든 것이 괜찮았습니다. 실행하는 데 많은 시간이 걸리는 기능은 기본 스레드를 차단하게 됩니다.

프로그램에 CPU를 많이 사용하는 기능이 여러 개 있으면 서버 처리량이 크게 저하됩니다. 최악의 경우 서버가 응답하지 않고 작업을 작업자 풀에 위임할 수 없게 됩니다.

AI, 빅 데이터, 기계 학습과 같은 분야는 Node.js의 이점을 누릴 수 없습니다. 이러한 작업은 기본 스레드를 차단하고 서버를 응답하지 않게 만들기 때문입니다. 하지만 멀티스레딩에 대한 지원이 추가된 Node.js v10.5.0이 출시되면서 상황이 달라졌습니다.

동시성 및 CPU 바인딩 작업의 문제

JavaScript에서 동시성을 설정하는 것은 어려울 수 있습니다. 여러 스레드가 동일한 메모리에 액세스하도록 허용하면 오류를 재현하기 어려울 뿐만 아니라 해결하기도 어려운 경쟁 조건이 발생할 수 있습니다.

Node.js는 원래 비동기 I/O를 기반으로 하는 서버 측 플랫폼으로 구현되었습니다. 이는 단순히 스레드의 필요성을 제거함으로써 많은 일을 더 쉽게 만듭니다. 예, Node.js 프로그램은 단일 스레드이지만 일반적인 방식은 아닙니다.

Node.js에서는 병렬로 실행할 수 있지만 스레드를 만들 필요는 없습니다. 운영 체제와 가상 머신은 함께 작동하여 I/O를 병렬로 사용하고, 데이터를 JavaScript 코드로 다시 전송해야 할 때 JS 코드는 단일 스레드에서 실행됩니다.

JS 코드를 제외하고 Node.js에서는 모든 것이 병렬로 실행됩니다. 비동기 블록과 달리 JS의 동기 블록은 항상 한 번에 한 번씩 실행됩니다. JS에서 I/O 이벤트가 발생하기를 기다리는 것은 코드를 실행하는 것보다 훨씬 더 많은 시간이 걸립니다.

Node.js 프로그램은 다른 코드의 실행을 차단하지 않고 필요한 함수나 콜백만 호출합니다. 처음에는 JavaScript나 Node.js 모두 CPU 집약적이거나 CPU 바인딩된 작업을 처리하도록 의도되지 않았습니다.

코드가 최소화되면 실행이 민첩해집니다. 그러나 계산량이 많을수록 실행 속도는 느려집니다.

JS 및 Node에서 여전히 CPU 집약적인 작업을 완료하려고 하면 브라우저의 UI가 정지되고 모든 I/O 이벤트가 대기열에 추가됩니다. 그래도 우리는 먼 길을 왔습니다. 이제 Worker_threads 모듈이 있습니다.

worker_threads 모듈을 사용하면 멀티스레딩이 쉬워집니다

Node.js v10.5.0은 2018년 6월에 출시되어 Worker_threads 모듈을 도입했습니다. 널리 사용되는 JavaScript 런타임 환경에서 동시성을 달성하는 데 도움이 됩니다. 이 모듈을 사용하면 완전한 기능을 갖춘 다중 스레드 Node.js 애플리케이션을 생성할 수 있습니다.

기술적으로 말하면 작업자 스레드는 별도의 스레드에서 생성된 일부 코드입니다. 작업자 스레드 사용을 시작하려면 먼저 Worker_threads 모듈을 가져와야 합니다. 그런 다음 작업자 스레드를 생성하려면 Worker 클래스의 인스턴스를 생성해야 합니다.

Worker 클래스의 인스턴스를 생성할 때 다음 두 가지 매개변수가 있습니다.

  1. 첫 번째 매개변수는 작업자 스레드에 대한 코드가 포함된 확장자가 .js 또는 .mjs인 파일 경로를 제공하고,
  2. 두 번째 매개변수는 An을 제공합니다.

작업 스레드는 여러 메시지 이벤트를 전달할 수 있습니다. 따라서 콜백 메서드는 Promise 반환보다 우선합니다.

작업자 스레드 간의 통신은 이벤트 기반입니다. 즉, 작업자 스레드가 이벤트를 보낸 후 즉시 리스너가 호출되도록 설정되어 있습니다. 가장 일반적인 4가지 이벤트는 다음과 같습니다.

worker.on('error', (error) => {});
  1. 작업 스레드에서 포착되지 않은 예외가 있을 때 발생합니다. 다음으로 작업자 스레드가 종료되고 오류가 콜백의 첫 번째 인수로 사용 가능합니다.
worker.on('exit', (exitCode) => {})
  1. 보조 스레드가 종료될 때 발생합니다. 작업자 스레드를 종료하기 위해 작업자 스레드에서 process.exit(),则会将 exitCode 提供给回调。如果 worker.terminate()가 호출되는 경우 코드는 1입니다.
worker.on('message', (data) => {});
  1. 작업 스레드가 상위 스레드로 데이터를 보낼 때 발생합니다.
worker.on('online', () => {});
  1. 작업 스레드가 JS 코드 구문 분석을 중지하고 실행을 시작할 때 발생합니다. 일반적으로 사용되지는 않지만 온라인 이벤트는 특정 상황에서 더 많은 정보를 제공할 수 있습니다.

작업자 스레드 사용 방법

작업자 스레드를 사용하는 방법에는 두 가지가 있습니다.

  • 방법 1 - 작업자 스레드를 생성하고 해당 코드를 실행한 후 결과를 상위 스레드로 보내는 작업이 포함됩니다. 이 방법을 사용하려면 새 작업을 수행할 때마다 처음부터 새 작업자 스레드를 만들어야 합니다.
  • 방법 2 – 작업자 스레드를 생성하고 메시지 이벤트에 대한 리스너를 설정하는 작업이 포함됩니다. 메시지가 트리거될 때마다 작업자 스레드는 코드를 실행하고 결과를 상위 스레드로 다시 보냅니다. 작업자 스레드는 나중에 사용할 수 있도록 활성 상태로 유지됩니다.

방법 2는 작업자 풀이라고도 합니다. 이는 이 방법에 작업자 풀을 만들고, 작업자가 기다리게 하고, 필요할 때 작업을 수행하기 위해 메시지 이벤트를 전달하는 작업이 포함되기 때문입니다.

작업 스레드를 처음부터 생성하려면 가상 머신을 생성하고 코드를 구문 분석 및 실행해야 하므로 공식 Node.js 문서에서는 방법 2를 권장합니다. 또한 방법 2는 방법 1보다 더 실용적이고 효과적입니다.

worker_threads 모듈에서 사용할 수 있는 중요한 속성

  • isMainThread – 이 속성은 작업자 스레드 내에서 작동하지 않을 때 true입니다. 원하는 경우 작업자 파일 시작 부분에 간단한 if 문을 포함할 수 있습니다. 이렇게 하면 작업자 스레드로만 실행됩니다.
  • parentPort – 상위 스레드와 통신하는 데 사용되는 MessagePort의 인스턴스입니다.
  • threadId – 작업자 스레드에 할당된 고유 식별자입니다.
  • workerData – 작업자 스레드의 생성자에 포함된 데이터입니다.

Node.js의 다중 프로세스

Node.js가 멀티 코어 시스템의 기능을 활용하려면 일부 프로세스를 사용할 수 있습니다. 널리 사용되는 JavaScript 런타임 환경에는 여러 프로세스에 대한 지원을 제공하는 클러스터라는 모듈이 있습니다.

클러스터 모듈을 사용하여 공통 포트를 공유할 수 있는 여러 하위 프로세스를 생성하세요. NodeJS를 사용하는 시스템은 하위 프로세스가 사용될 때 더 큰 작업 부하를 처리할 수 있습니다.

백엔드의 Node.js

인터넷은 전 세계 수백만 기업이 선택하는 플랫폼이 되었습니다. 따라서 비즈니스가 잠재력을 최대한 발휘하고 그 과정에서 두각을 나타내기 위해서는 강력한 온라인 입지가 필요합니다.

모든 것은 강력하고 직관적인 웹사이트에서 시작됩니다. 완벽한 웹사이트를 만들려면 최고의 프런트엔드 및 백엔드 기술을 선택하는 것이 중요합니다. 본질적으로 단일 스레드임에도 불구하고 Node.js는 백엔드 웹 서비스 개발을 위한 첫 번째 선택입니다.

다양한 백엔드 멀티스레딩 옵션에도 불구하고 유명 기업은 Node.js를 선호합니다. 이는 Node.js가 이미 "웹에서 가장 인기 있는 프로그래밍 언어"인 JavaScript에서 멀티스레딩을 사용하기 위한 해결 방법을 제공하기 때문입니다.

요약

worker_threads 모듈은 Node.js 프로그램에서 멀티스레딩을 구현하는 쉬운 방법을 제공합니다. 무거운 계산을 작업자 스레드에 위임하면 서버 처리량을 크게 늘릴 수 있습니다.

멀티스레딩 지원을 통해 Node.js는 AI, 빅데이터, 기계 학습과 같은 컴퓨팅 집약적 분야의 점점 더 많은 개발자, 엔지니어 및 기타 전문가를 유치할 것입니다.

영어 원문 주소: https://platlogic.com/blog/multi-threading-and-multiple-process-in-node-js/

이 글은 가독성을 보장하기 위해 직역이 아닌 무료 번역을 사용합니다. .

더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 교육을 방문하세요! !

위 내용은 Node.js의 멀티스레딩 및 멀티프로세싱에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제