Node.js의 이벤트 중심 아키텍처와 다른 언어의 멀티 스레드 프로그래밍의 차이점은 무엇입니까?


대답 1:

이벤트 중심 및 다중 스레드 패러다임 모두에서 코드가 운영 체제 프로세스 내에서 실행됩니다.

프로세스가 여러 스레드를 실행할 때이 스레드는 읽기 및 쓰기를 위해 프로세스 메모리 (주소 공간)를 공유합니다.

Node.js를 지원하는 JavaScript는 설계 상 단일 스레드입니다. 모든 함수는 완료 될 때까지 실행되며 현재 프로세스의 다른 JavaScript 코드는 해당 함수 실행 중에 실행되지 않습니다. 자연적으로 비동기적인 이벤트 (네트워크, 디스크 입출력, 타이머, 기타 하드웨어 및 운영 체제 이벤트)는 엔진에서 처리합니다. 엔진은 이러한 이벤트에 대한 핸들러 (또는 콜백)로 등록 된 JavaScript 함수를 이벤트 루프 큐에 추가하여 대기열 앞의 기능이 완료되었습니다.

다중 스레드 패러다임에서 두 개 이상의 스레드가 코드를 병렬로 실행하므로 함수 실행 중에 다른 프로세서 코어에서도 다른 코드 조각이 실행될 수 있으므로 동일한 메모리 주소를 읽거나 쓸 수 있습니다. 공유 메모리에 대한 액세스를 관리하기 위해 코드에서 특수한 운영 체제 메커니즘 (동기 프리미티브)을 사용하지 않으면 메모리 상태가 일치하지 않을 수 있습니다.



대답 2:

“Node.js의 이벤트 중심 아키텍처와 다른 언어의 멀티 스레드 프로그래밍의 차이점은 무엇입니까?”라는 좋은 질문입니다.

우리는 이것을 조금 세분화 할 수 있고 또해야만합니다.

  • 노드의 이벤트 중심 아키텍처.

이벤트 중심 아키텍처는 Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (다중 언어)와 같은 노드에만 적용되지 않습니다.

  • 다른 언어로 된 멀티 스레드 프로그래밍

JavaScript는 의도적으로 여러 스레드를 지원하지 않습니다. 비록 내가 아는 한 스레드로 기능 할 수있는 웹 워커를 지원하지만.

따라서 이벤트 중심은 노드마다 고유하지 않으며 노드에서 멀티 스레딩을 수행 할 수 있습니다.

여기에는 "이벤트 중심과 멀티 스레딩의 차이점"과 "노드와 다른 언어 (프레임 워크)의 차이점"이라는 두 가지 질문이 있습니다. 나는 이것이 질문의 의도 인 것처럼 보이기 때문에 후자에 초점을 맞출 것이다.

Node를 특별하게 만드는 것은 저자가 웹 응용 프로그램을 구축 할 때 IO 차단을 피하기 위해 만든 것입니다. Node 커뮤니티의 문화는 비 차단 IO의 강점을 강조하고 구축하는 것입니다. 통화 차단을 수행하는 타사 라이브러리를 너무 많이 찾지 못할 것입니다. Node를 사용하는 개발자는 코드에서 미묘한 차단 작업을 수행 할 가능성이 적습니다. 다른 언어에서는 순진한 개발자가 실수로 데이터베이스 연결에서 읽는 것과 같이 매우 비효율적 인 차단 호출을 수행 할 수 있습니다.

그 외에도, "동시성"에 대한 여러 모델에 대해 읽고, 각각의 장단점을 이해해야합니다. 왜 멀티 스레딩이 그토록 오랫동안 받아 들여 졌는지 이해하기위한 보너스 포인트.



대답 3:

개념적 차이는 머리를 감싸기 매우 쉽습니다.

이벤트 중심 아키텍처에서 프로그램은 연속 단일 스레드 루프에서 실행됩니다 (노드에서 일부 멀티 스레딩을 수행 할 수 있지만 지금은 걱정하지 마십시오). 이벤트가 발생하면 프로그램 레저에서 처리 할 작업이 콜 스택에 있습니다.

다중 스레드 아키텍처는 일반적으로 작업을 기다려야 할 때 새 스레드를 전달합니다. 따라서 데이터베이스를 호출하고 필요한 모든 작업을 수행하고 필요한 작업을 수행하고 원래 스레드를 결론 또는 재결합하는 새 스레드를 시작합니다.

이 두 가지 방법은 다른 것들에 매우 유용합니다. 프로그램은 새로운 이벤트가 발생할 때를 알지 못하고 이벤트가 자주 발생하기 때문에 사용자 중심의 이벤트 및 서버에 적합합니다. 스레딩은 문제를 훨씬 더 작은 조각으로 나누려는 (또는 단일 스레드 루프의 한계에 도달하는) 계산량이 많은 작업에 필요합니다.