GithubHelp home page GithubHelp logo

node-js-event-loop/ about blog HOT 22 CLOSED

utterances-bot avatar utterances-bot commented on August 26, 2024
node-js-event-loop/

from blog.

Comments (22)

korECM avatar korECM commented on August 26, 2024 4

@ChanYangYu

  1. libuv의 공식 홈페이지 설명을 보면 아래와 같이 소개되어 있습니다.

libuv is cross-platform support library which was originally written for Node.js. It’s designed around the event-driven asynchronous I/O model.

즉, libuv는 비동기 입출력, 이벤트 관련 기능을 지원하기 위해 OS 커널을 추상화한 라이브러리라고 생각할 수 있습니다.
그래서 이벤트 루프는 특정 라이브러리라기보다는 비동기 처리를 하는 방법 중 하나이고 libuv가 이를 구현했다고 생각하면 편합니다.


출처

위 사진을 보면 알 수 있듯이 Node.js는 비동기 처리를 libuv에게 위임하는데 libuv는 내부적으로 여러 Phase를 나누어서 비동기 처리를 하고 이 방법이 이벤트 루프라고 생각하면 될 것 같습니다.


그래서 이벤트 루프는 종종 이벤트 드리븐을 구현하는 방법으로 많이 이야기 되고


Spring WebFlux 또한 요청을 처리하기 위해 이벤트 루프를 사용하는 것을 알 수 있습니다.

  1. 이 부분에 대해서는 다른 글이나 공식 문서에서도 자세한 내용이 없어서 확실하지는 않지만 제가 이해한 바는 아래와 같습니다.
    Node.jsV8 엔진을 기반으로 돌아가기가 때문에 js 코드의 실행 또한 V8 엔진이 맡게 됩니다. 따라서 이벤트 루프가 생성되고 전체 코드 실행이 완료되면 기다리고 있는 비동기 로직들이 이벤트 루프의 각 페이즈의 큐에 담기게 됩니다.

예를 들어서 main.js에서 구글에 HTTP 요청을 하나 보냈다면 Poll Phase에 HTTP 응답을 기다리는 무언가가 큐에 담기게 됩니다. 구글로부터 HTTP 응답이 오면 libuvFD(File Descriptor)를 통해서 응답이 왔다는 사실을 알게되고 이 FD와 매칭되는 콜백을 Poll Phase의 큐에서 찾아서 실행하게 됩니다.

이때 콜백은 결국 js 코드가 되므로 libuv가 이 콜백을 V8 엔진을 사용해서 실행한다고 생각하면 됩니다. 실제로 libuv는 이벤트 루프 안에 v8::Isolate, v8::Context 등을 가지고 있는데 이것을 사용해서 콜백 코드를 실행한다고 생각하면 됩니다.

만약 HTTP 응답 콜백에서 네이버에 HTTP 요청을 보내는 코드가 있다면 아래와 같은 순서로 진행된다고 생각하면 됩니다.

  1. main.js에서 구글에 HTTP 요청 보냅니다.
  2. 네트워크 요청을 보냄에 따라서 FD가 할당되고 libuvPoll Phase에서 이 FD를 기다리는 콜백을 큐에 넣습니다.
  3. 구글로부터 HTTP 응답이 오면 libuvFD를 통해 응답이 온 것을 감지하고 이 FD에 대응되는 콜백을 Poll Phase의 큐에서 찾아서 V8 엔진으로 이 콜백을 실행합니다.
  4. 이 콜백을 실행하면 네이버에 다시 HTTP 요청을 보내고 FD가 할당되고 이 FD를 기다리는 콜백이 다시 Poll Phase의 큐에 들어갑니다.
  5. 네이버 HTTP 응답이 오면 다시 libuvPoll Phase의 큐에서 콜백을 V8 엔진으로 실행합니다.
  6. 이러한 과정이 이벤트 루프에 남아있는 콜백이 없을 때까지 반복됩니다.

.

  1. 핵심 동작은 비슷할 수 있지만 구현이 달라 세부적인 동작이 다를 수도 있습니다.
    실제로 Chromelibevent를 사용하고 Node.jslibuv를 사용합니다.

찾아보니까 아래와 같은 Node.js와 브라우저 비교 글도 있네요.

저도 자세한 내용은 몰라서 아래 내용들을 참고해보면 좋을 것 같습니다.
https://www.youtube.com/watch?v=u1kqx6AenYw
https://stackoverflow.com/questions/25750884/are-there-significant-differences-between-the-chrome-browser-event-loop-versus-t
https://yoeubi28.medium.com/browser-vs-node-event-loop-차이-9c87f858051d
https://blog.insiderattack.net/javascript-event-loop-vs-node-js-event-loop-aea2b1b85f5c
https://www.reddit.com/r/javascript/comments/downgn/askjs_event_loop_browser_vs_node/

from blog.

korECM avatar korECM commented on August 26, 2024 1

@dontbesatisfied
makej 옵션은 빌드를 할 때 병렬적으로 할당하는 작업의 개수를 말합니다. 컴퓨터 코어 수에 맞게 적당한 값을 적어주시면 됩니당

       -j [jobs], --jobs[=jobs]
            Specifies the number of jobs (commands) to run simultaneously.  If
            there is more than one -j option, the last one is effective.  If the
            -j option is given without an argument, make will not limit the
            number of jobs that can run simultaneously.

from blog.

ChanYangYu avatar ChanYangYu commented on August 26, 2024

와우... 정말 궁금했던 내용이고 공식문서를 봐도 잘 이해가 안되었던 부분인데 너무 잘 설명해주셔서 감사합니다!!
글을 읽다가 추가로 궁금한점이 생겨서 몇가지 질문을 드리고 싶습니다!

  1. 이벤트 루프는 libuv에 포함되어 있는건가요?
  2. 이벤트 루프의 각 Phase에서는 비동기 처리 로직을 libuv에 위임하고 libuv에서 요청을 처리한 이후 콜백을 해당 Phase 큐에 담아주는걸까요?
  3. Nodejs 이벤트루프 방식과 브라우저의 이벤트루프 방식은 차이가 있을까요?

from blog.

ChanYangYu avatar ChanYangYu commented on August 26, 2024

정말 꼼꼼한 답변 감사드립니다!
이해가 잘 안되었던 부분이었는데 이제야 이해가 되네요 ㅎㅎ
좋은 글 보고 자극 얻어갑니다!

from blog.

epitone avatar epitone commented on August 26, 2024

정말 좋은 글 감사드립니다. 이벤트 루프에 대해 이해가 전혀 되지 않았는데, 글을 읽고 크게 도움을 얻을 수 있었습니다. 계속 반복해서 글을 보면서, 공부하고 있는데 혹시 이 글을 보고 공부한 내용을 블로그에 출처를 남기고 작성해도 괜찮을까요?

from blog.

korECM avatar korECM commented on August 26, 2024

@epitoneproject 넵 괜찮습니다!

from blog.

seungtaek95 avatar seungtaek95 commented on August 26, 2024

정성이 느껴지는 게시글입니다. 재밌게 정독할 수 있었습니다!

from blog.

dontbesatisfied avatar dontbesatisfied commented on August 26, 2024

해당 레포에서
make -j n 의 n이 의미하는것이 무엇인가요?

from blog.

Sun26-Avrin avatar Sun26-Avrin commented on August 26, 2024

작성자님의 정성으로 제 시간을 세이브했네요 ㅠㅠ... 너무 감사합니다...!!!!

from blog.

gaonK avatar gaonK commented on August 26, 2024

정성 가득한 글 너무 잘 읽었습니다. 많은 도움이 되었습니다 :)

from blog.

junguksim avatar junguksim commented on August 26, 2024

최고의 글입니다.

from blog.

tastestar91 avatar tastestar91 commented on August 26, 2024

정말 자세한글 감사합니다!

from blog.

jabel123 avatar jabel123 commented on August 26, 2024

엄청난 글이군요

from blog.

MySprtlty avatar MySprtlty commented on August 26, 2024

다 읽는데 두시간이 걸렸습니다.
좋은 글 정말 감사합니다 :)

from blog.

tre2man avatar tre2man commented on August 26, 2024

정보 정리가 잘되어있네요. 감사합니다.

from blog.

Yesung-Han avatar Yesung-Han commented on August 26, 2024

노드 내부 코드가 저렇게 생겼군요! 자세한 글 감사합니다.

from blog.

amkorousagi avatar amkorousagi commented on August 26, 2024

감사합니다.

from blog.

luckyhyom avatar luckyhyom commented on August 26, 2024

집요함에 감탄하고 갑니다 ㅎㅎ

from blog.

kscory avatar kscory commented on August 26, 2024

지금까지 본 글 중에 최고에요. 감사합니다.

from blog.

memoer avatar memoer commented on August 26, 2024

유용한 정보 감사합니다. 혹시 해당 글에서 적혀진 node 스레드 개수 확인하는 사진은 어떤 명령어를 치면 나오는 결과물인가요..?

from blog.

Jonghakseo avatar Jonghakseo commented on August 26, 2024

너무 재미있게 잘 읽었습니다!

from blog.

jhpung avatar jhpung commented on August 26, 2024

많은 수고가 묻어나오는 글이네요. 이벤트 루프 리마인드에 많은 도움이 됐습니다. 개인적으로 이벤트 루프에 대하 포스팅을 할까 했는데 이 글보다 더 잘 쓸런지 모르겠어서 보류해야겠네요 😅

from blog.

Related Issues (5)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.