>웹 프론트엔드 >JS 튜토리얼 >노드 단일 스레드는 높은 동시성 원리를 실현합니다.

노드 단일 스레드는 높은 동시성 원리를 실현합니다.

小云云
小云云원래의
2018-02-07 13:36:402541검색

이 글은 주로 노드 단일 스레드 높은 동시성 및 노드 비동기 I/O의 원리를 소개합니다. 관심이 있다면 이에 대해 알아볼 수 있기를 바랍니다.

1. 높은 동시성을 구현하는 노드 단일 스레드의 원리

우리 모두 알고 있듯이 nodejs는 높은 동시성을 지원하는 단일 스레드 스크립팅 언어입니다. 그런데 왜 단일 스레드 nodejs가 높은 동시성을 지원할 수 있습니까? 많은 사람들이 그 원리를 이해하지 못합니다. 아래에서 제가 이해한 내용을 설명하겠습니다.

1. 노드의 장점: I/O 집약적 처리는 노드의 I/O 요청이 모두 비동기식이기 때문에 노드의 장점입니다. as: SQL 쿼리 요청, 파일 스트림 작업 요청, http 요청...)

a. 비동기란 무엇입니까?

비동기: 작업 명령을 실행하면 모든 작업이 완료된 후 콜백이 실행됩니다.

비동기 구현 원칙:


// 第一步:定义变量
let a = 1;

// 第二步:发出指令,然后把回调函数加入异步队列(回调函数并没有执行)
setTimeout(() => {
 console.log(a);
}, 0)
// 第三步:赋值,回调函数没有执行
a = 2;
// 第四步:发出指令,然后把回调函数加入异步队列(回调函数并没有执行)
setTimeout(() => {
 console.log(a);
}, 0)
// 第五步:赋值,回调函数没有执行
a = 3;
// 当所有代码执行完毕,cpu空闲下来了,就会开始执行异步队列里面的回调函数
// 所以最后控制台输出:3 3

b.

이름에서 알 수 있듯이 비동기 I/O는 I/O 요청을 비동기적으로 발행하는 것입니다

c. nodejs는 I/O 요청을 비동기적으로 발행할 수 있지만, nodejs는 왜 높은 동시성을 지원할 수 있나요?

nodejs의 I/O 작업으로 인해 하위 레이어에서 멀티스레딩이 활성화됩니다.

동시에 여러 IO 요청이 있는 경우 메인 스레드는 여러 eio 스레드를 생성하여 IO 요청 처리 속도를 향상시킵니다.

추가 지식 포인트:

d. nodejs의 I/O 작업은 멀티스레딩을 가능하게 하지만 모든 스레드는 기본 스레드를 기반으로 시작되고 하나의 프로세스에서만 실행될 수 있으므로 여전히 CPU 리소스를 완전히 활용할 수 없습니다.

pm2 프로세스 관리자가 이 문제를 해결할 수 있습니다

pm2는 로드 밸런싱 기능을 갖춘 Node 애플리케이션용 프로세스 관리자입니다.

e. CPU 코어 수와 스레드 수의 관계

과거 단일 CPU 시대에는 단일 작업 한 시점에 하나의 프로그램만 실행할 수 있습니다. 나중에는 컴퓨터가 동일한 시점에 여러 작업이나 프로세스를 병렬로 실행할 수 있는 멀티 태스킹 단계로 발전했습니다. 진정한 의미에서 "동일한 시점"은 아니지만 여러 작업이나 프로세스가 CPU를 공유하며 여러 작업 간에 실행 중인 CPU 전환을 완료하는 것은 운영 체제에 맡겨져 있습니다. 특정 혜택을 얻을 수 있는 기회. 이제 멀티 코어 CPU를 사용하면 여러 작업을 동시에 실행할 수 있습니다. 이 작업이 실행되는 특정 CPU 코어는 운영 체제 및 CPU 자체의 설계와 관련이 있습니다

2. CPU 집약적인 작업을 잘합니다

a. CPU 집약적인 작업이란 무엇입니까(복잡한 작업, 이미지 작업)


// 这就是一个cpu密集型的操作
for (let i = 0; i < 1000000; i++) {
 console.log(i);
}

b. nodejs는 단일 스레드이기 때문에 CPU 집약적인 작업을 잘 못하는 이유

관련 권장 사항:


단일 스레드 JS 실행 문제에 대한 자세한 설명

JS 단일 스레드 비동기 io 콜백의 특성에 대한 자세한 설명

JavaScript 단일 스레드에 대한 몇 가지 사항에 대한 자세한 소개( 사진)

위 내용은 노드 단일 스레드는 높은 동시성 원리를 실현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.