이 글은 여러분에게 node.js를 이해하고, node의 멀티 프로세스와 멀티 스레딩을 소개하고, 멀티 프로세스와 멀티 스레드를 비교하는 데 도움이 될 것입니다.
node.js에서 자바스크립트 코드 실행은 단일 스레드이지만 Node 자체는 실제로 다중 스레드입니다.
노드 자체는 세 개의 레이어로 나누어져 있습니다
첫 번째 레이어는 Node.js 표준 라이브러리인데 이 부분은 자바스크립트, 즉 사용 중에 직접 호출할 수 있는 API로 작성되어 있는데, 소스 코드의 lib 디렉토리에서 볼 수 있습니다.
두 번째 레이어, 노드 바인딩, 이 레이어는 Javascript와 기본 C/C++ 간의 통신의 핵심입니다. 전자는 바인딩을 통해 후자를 호출하고 서로 데이터를 교환합니다. 세 번째 층.
세 번째 레이어는 Node.js의 작업을 지원하는 핵심이며 C/C++로 구현되며 노드에서 구현하는 기본 로직 중 일부입니다.
그 중 Libuv의 세 번째 레이어는 Node.js에 크로스 플랫폼, 스레드 풀, 이벤트 풀, 비동기 I/O 및 기타 기능을 제공하는데, 이는 Node.js를 강력하게 만드는 핵심입니다.
Libuv는 이벤트 루프 메커니즘을 제공하므로 JavaScript는 IO 처리 측면에서 차단되지 않습니다. 따라서 노드를 사용하여 웹 서비스를 구축할 때 과도한 IO 볼륨으로 인해 다른 요청이 차단되는 것에 대해 걱정할 필요가 없습니다.
그러나 IO가 아닌 작업의 실행은 노드의 메인 스레드에서 실행됩니다. 이는 단일 스레드 실행 작업이므로 시간이 많이 걸리는 동기 계산 작업이 있으면 다른 코드의 실행이 차단됩니다. .
const Koa = require('koa'); const app = new Koa(); app.use(async (ctx) => { const url = ctx.request.url; if (url === '/') { ctx.body = {name: 'xxx', age: 14} } if(url==='/compute'){ let sum=0 for (let i = 0; i <100000000000 ; i++) { sum+=i } ctx.body={sum} } }) app.listen(4000, () => { console.log('http://localhost:4000/ start') })
위 코드에서 http가 /compute
를 요청하면 노드는 CPU를 호출하여 대량의 계산을 수행하게 됩니다. 이때 다른 http 요청이 들어오면 차단이 발생합니다. /compute
,node会调用cpu进行大量的计算,这时如果有其他http请求进入,将会发生阻塞。
那么如何解决这个问题呢?
有两种方案,一种是使用children_process
或者cluster
开启多进程进行计算,一种是使用worker_thread
이 문제를 해결하는 방법은 무엇입니까? 두 가지 해결책이 있습니다. 하나는 children_process
또는 cluster
를 사용하여 다중 프로세스 계산을 활성화하는 것이고, 다른 하나는 worker_thread
를 사용하여 멀티스레딩 활성화 계산 수행
멀티 스레딩과 멀티 프로세스 비교: | 속성 | 멀티 프로세스 | |
---|---|---|---|
데이터 | 데이터 공유는 복잡하고 IPC가 필요합니다. 데이터가 분리되어 동기화가 간단합니다. | ||
각각의 장점이 있습니다 | CPU와 메모리 | 메모리 많이 차지, 전환 복잡, CPU 활용도 낮음 | |
멀티스레딩이 더 좋음 | 파괴, 전환 | 생성, 파괴 , 복잡한 전환, 느림 | |
스레드가 많을수록 좋습니다 | coding | 간단한 코딩과 편리한 디버깅 | |
복잡한 코딩과 디버깅 | 신뢰성 | 프로세스는 독립적으로 실행되며 서로 영향을 주지 않습니다. | |
다중 프로세스가 더 좋습니다 | 분산 | 다중 기계 다중 코어 배포에 사용할 수 있으며 확장이 쉽습니다 |
멀티 프로세스가 더 좋습니다
worker_threads멀티 스레딩을 사용하여 위의 코드 계산 문제를 해결하세요:
여기 공식 문서//api.js const Koa = require('koa'); const app = new Koa(); const {Worker} = require('worker_threads') app.use(async (ctx) => { const url = ctx.request.url; if (url === '/') { ctx.body = {name: 'xxx', age: 14} } if (url === '/compute') { const sum = await new Promise(resolve => { const worker = new Worker(__dirname+'/compute.js') //接收信息 worker.on('message', data => { resolve(data) }) }) ctx.body = {sum} } }) app.listen(4000, () => { console.log('http://localhost:4000/ start') }) //computer.js const {parentPort}=require('worker_threads') let sum=0 for (let i = 0; i <1000000000 ; i++) { sum+=i } //发送信息 parentPort.postMessage(sum)로그인 후 복사
https:/ /nodejs.org/dist/latest-v16.x/docs/api/worker_threads.html다중 프로세스를 사용하여 해결 위 코드의 계산 문제:
여기 공식 문서 child_process//api.js const Koa = require('koa'); const app = new Koa(); const {fork} = require('child_process') app.use(async (ctx) => { const url = ctx.request.url; if (url === '/') { ctx.body = {name: 'xxx', age: 14} } if (url === '/compute') { const sum = await new Promise(resolve => { const worker =fork(__dirname+'/compute.js') worker.on('message', data => { resolve(data) }) }) ctx.body = {sum} } }) app.listen(4000, () => { console.log('http://localhost:4000/ start') }) //computer.js let sum=0 for (let i = 0; i <1000000000 ; i++) { sum+=i } process.send(sum)로그인 후 복사가 있습니다. https://nodejs.org/dist/latest-v16.x/docs/api/child_process.html
🎜🎜더 많은 노드 관련 지식을 얻으려면 🎜nodejs 튜토리얼🎜을 방문하세요! 🎜위 내용은 노드의 다중 처리 및 다중 스레딩에 대해 이야기하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!