목차
비동기 I/O를 사용하는 이유
사용자 경험
三、node的异步I/O
웹 프론트엔드 JS 튜토리얼 노드 비동기 I/O 소개

노드 비동기 I/O 소개

Jul 11, 2018 pm 03:44 PM
node.js

이 글에서는 주로 참고할만한 가치가 있는 노드 비동기 I/O에 대해 소개합니다. 도움이 필요한 친구들이 참고할 수 있도록 하겠습니다.

비동기 I/O를 사용하는 이유

사용자 경험

Javascript는 UI 스레드와 동일한 스레드인 단일 스레드에서 실행됩니다. 동기화를 사용하는 경우 JavaScript가 실행될 때 UI 렌더링이 대기를 중지해야 하므로 사용자 경험이 매우 저하됩니다.

웹 페이지가 일부 리소스를 요청하고 이를 동기식으로 가져와야 하는 경우 실행을 계속하기 전에 js가 서버에서 리소스를 완전히 가져올 때까지 기다려야 합니다. 이 기간 동안 UI는 대기하며 이는 사용자가 매우 열악하고 사용자 경험에 영향을 미칩니다.

// 现在请求两个资源
//耗时为M毫秒
getData('from_db');
//耗时为N毫秒
getData('from_remote_api');
로그인 후 복사

동기식이면 (M + N) 시간이 걸립니다.

비동기식이면 Max(M, N) 시간이 걸립니다.

(M + N)
如果是异步,需要耗时Max(M, N);

随着应用的复杂性,情景会变成M+N+...和Max(M,N,...),此时同步和异步的优劣就会更加凸显。另一方面,随着网站和应用的扩展,数据往往会分布到多台服务器上,而分布意味着M和N的值会线性增长,这也会放大异步和同步在性能上的差异。总之,IO是昂贵的,分布式IO是更昂贵的!

资源分配

单线程同步IO

会因阻塞IO使得硬件资源无法得到更优的利用。
로그인 후 복사

多线程编程

优点: 可以利用多核CPU有效提升CPU的利用率
缺点: 编程中的死锁、状态同步使得程序员很是头疼。
로그인 후 복사

node的异步IO

node采用的异步IO,利用单线程,远离了多线程死锁、状态同步,利用异步让单线程远离了阻塞,使得CPU得到更好的利用。

为了弥补单线程无法利用多核CPU的问题,Node提供了子进程 `childProcess` ,将一些运算多的任务放入子进程进行高效的运算。
로그인 후 복사

노드 비동기 I/O 소개

二、阻塞I/O 和 非阻塞 I/O

阻塞IO

阻塞的IO操作就是发起IO操作后,线程阻塞等待IO完成,这期间cpu得不到有效利用。
로그인 후 복사

노드 비동기 I/O 소개

非阻塞IO

非阻塞IO操作其实就是发起IO操作后,通过事件轮巡,或者事件通知机制,不断查询IO操作是否完成,或者是主线程进入休眠等待事件通知IO结束,然后继续向下执行代码,实际上非阻塞IO期间,cpu要不用来查询要不用来休眠,也没有得到有效利用。依旧是同步IO。
로그인 후 복사

노드 비동기 I/O 소개

三、node的异步I/O

完成整个异步IO需要单个环节 事件循环 观察者 请求对象

实际上node的异步IO是采用了线程池技术,发起异步IO时,把io操作扔到线程池里面执行,然后主线程继续执行其他操作,io执行完毕通过线程间通信通知主线程,主线程执行回调。

IO线程是由Libuv(Linux下由libeio具体实现;window下则由IOCP具体实现)管理的线程池控制的,本质上是多线程。即采用了线程池阻塞IO模拟了异步IO애플리케이션이 복잡해지면 시나리오는 M+N+... 및 Max(M, N,...)가 됩니다. 이때 동기식과 비동기식의 장단점은 다음과 같습니다. 더욱 두드러지게 됩니다. 반면, 웹사이트와 애플리케이션이 확장되면서 데이터가 여러 서버에 분산되는 경우가 많으며, 분산된다는 것은 M과 N의 값이 선형적으로 증가한다는 것을 의미하며, 이는 비동기식과 동기식의 성능 차이도 증폭시키게 됩니다. 즉, IO는 비용이 많이 들고, 분산 IO는 훨씬 더 비쌉니다!

리소스 할당노드 비동기 I/O 소개

단일 스레드 동기 IOrrreee

멀티 스레드 프로그래밍

rrreee

노드의 비동기 IO

rrreee노드 비동기 I/O 소개
2. 차단 I/O 및 비차단 I/O

3442411541 -5b456a1f2c544_ 기사x[ 1].png🎜🎜🎜비차단 IO🎜🎜rrreee🎜노드 비동기 I/O 소개🎜🎜3. 노드의 비동기 I/O🎜🎜전체 비동기 IO를 완료하려면 단일 링크 이벤트 루프 <code>관찰 요청 개체. 🎜🎜실제로 노드의 비동기 IO는 스레드 풀 기술을 사용합니다. 비동기 IO가 시작되면 io 작업이 실행을 위해 스레드 풀에 던져지고, io 실행이 완료된 후 메인 스레드가 계속해서 다른 작업을 수행합니다. 스레드 간 통신을 통해 메인 스레드에 알림이 전달됩니다. 🎜🎜IO 스레드는 Libuv(libeioLinux, 의 <code>window 아래)에 의해 구체적으로 구현됩니다. IOCP(특정 구현)에 의해 관리되는 스레드 풀에 의해 제어되며 본질적으로 다중 스레드입니다. 즉, 스레드 풀블로킹 IO비동기 IO를 시뮬레이션하는 데 사용됩니다. 🎜🎜🎜🎜🎜🎜비동기 IO의 원리🎜🎜🎜IO가 발생하면 이를 스레드 풀의 IO 스레드에 넣고 IO 스레드에서 작업을 실행하도록 IO 스레드를 차단합니다. 그런 다음 메인 스레드에서 실행을 계속합니다. 다른 IO 작업이 발생하면 이를 스레드 풀에 넣은 다음 다른 IO 스레드(또한 차단 IO 모드)에서 실행하면 메인 스레드가 계속 실행됩니다. 🎜🎜위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요! 🎜🎜관련 권장사항: 🎜🎜🎜Node 모듈 메커니즘 분석에 대하여🎜🎜🎜🎜🎜Node 기본 개념 소개🎜🎜🎜

위 내용은 노드 비동기 I/O 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Node V8 엔진의 메모리와 GC에 대한 자세한 그래픽 설명 Node V8 엔진의 메모리와 GC에 대한 자세한 그래픽 설명 Mar 29, 2023 pm 06:02 PM

이 기사는 NodeJS V8 엔진의 메모리 및 가비지 수집기(GC)에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다.

Node의 메모리 제어에 관한 기사 Node의 메모리 제어에 관한 기사 Apr 26, 2023 pm 05:37 PM

Non-Blocking, Event-Driven 기반으로 구축된 Node 서비스는 메모리 소모가 적다는 장점이 있으며, 대규모 네트워크 요청을 처리하는데 매우 적합합니다. 대규모 요청을 전제로 '메모리 제어'와 관련된 문제를 고려해야 합니다. 1. V8의 가비지 수집 메커니즘과 메모리 제한 Js는 가비지 수집 기계에 의해 제어됩니다.

최고의 Node.js Docker 이미지를 선택하는 방법에 대해 이야기해 볼까요? 최고의 Node.js Docker 이미지를 선택하는 방법에 대해 이야기해 볼까요? Dec 13, 2022 pm 08:00 PM

Node용 Docker 이미지를 선택하는 것은 사소한 문제처럼 보일 수 있지만 이미지의 크기와 잠재적인 취약점은 CI/CD 프로세스와 보안에 상당한 영향을 미칠 수 있습니다. 그렇다면 최고의 Node.js Docker 이미지를 어떻게 선택합니까?

Node의 파일 모듈에 대해 자세히 이야기해 보겠습니다. Node의 파일 모듈에 대해 자세히 이야기해 보겠습니다. Apr 24, 2023 pm 05:49 PM

파일 모듈은 파일 읽기/쓰기/열기/닫기/삭제 추가 등과 같은 기본 파일 작업을 캡슐화한 것입니다. 파일 모듈의 가장 큰 특징은 모든 메소드가 **동기** 및 ** 두 가지 버전을 제공한다는 것입니다. 비동기**, sync 접미사가 있는 메서드는 모두 동기화 메서드이고, 없는 메서드는 모두 이기종 메서드입니다.

Node.js 19가 공식적으로 출시되었습니다. Node.js의 6가지 주요 기능에 대해 이야기해 보겠습니다! Node.js 19가 공식적으로 출시되었습니다. Node.js의 6가지 주요 기능에 대해 이야기해 보겠습니다! Nov 16, 2022 pm 08:34 PM

Node 19가 정식 출시되었습니다. 이 글에서는 Node.js 19의 6가지 주요 기능에 대해 자세히 설명하겠습니다. 도움이 되셨으면 좋겠습니다!

Node.js의 GC(가비지 수집) 메커니즘에 대해 이야기해 보겠습니다. Node.js의 GC(가비지 수집) 메커니즘에 대해 이야기해 보겠습니다. Nov 29, 2022 pm 08:44 PM

Node.js는 GC(가비지 수집)를 어떻게 수행하나요? 다음 기사에서는 이에 대해 설명합니다.

Node의 이벤트 루프에 대해 이야기해 봅시다. Node의 이벤트 루프에 대해 이야기해 봅시다. Apr 11, 2023 pm 07:08 PM

이벤트 루프는 Node.js의 기본 부분이며 메인 스레드가 차단되지 않도록 하여 비동기 프로그래밍을 가능하게 합니다. 이벤트 루프를 이해하는 것은 효율적인 애플리케이션을 구축하는 데 중요합니다. 다음 기사는 Node.js의 이벤트 루프에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다!

노드가 npm 명령을 사용할 수 없으면 어떻게 해야 합니까? 노드가 npm 명령을 사용할 수 없으면 어떻게 해야 합니까? Feb 08, 2023 am 10:09 AM

노드가 npm 명령을 사용할 수 없는 이유는 환경 변수가 올바르게 구성되지 않았기 때문입니다. 해결 방법은 다음과 같습니다. 1. "시스템 속성"을 엽니다. 2. "환경 변수" -> "시스템 변수"를 찾은 다음 환경을 편집합니다. 3. nodejs 폴더의 위치를 ​​찾습니다. 4. "확인"을 클릭합니다.

See all articles