단일 스레드 프로그래밍 모델에서 비동기 프로그래밍은 어떻게 작동합니까?
세부 사항을 살펴 node.js
보고 기본적으로 단일 스레드 모델을 제공하지만 비동기 프로그래밍을 지원한다는 것을 알게되었습니다.
이러한 경우 비동기 프로그래밍은 어떻게 처리됩니까? 런타임 자체가 스레드를 생성하고 관리하는 것과 같지만 프로그래머가 명시 적으로 스레드를 생성 할 수 없습니까? 누군가가 이것에 대해 배울 수있는 몇 가지 리소스를 알려줄 수 있다면 좋을 것입니다.
지금 나와 함께 말해 보세요. 비동기 프로그래밍이 반드시 다중 스레드를 의미하는 것은 아닙니다.
자바 스크립트는 단일 스레드 런타임입니다. 언어 / 런타임이이를 지원하지 않기 때문에 JS에서 새 스레드를 만들 수 없습니다.
프랭크는 정확하게 말하고 있습니다 (물론 그렇기는하지만) 영어로 : 앱에 물건이 들어올 때를 처리하는 메인 이벤트 루프가 있습니다. 따라서 "handle this HTTP request"는 이벤트 큐에 추가 된 다음 적절한 경우 이벤트 루프에 의해 처리됩니다.
비동기 작업 (예 : mysql db 쿼리)을 호출하면 node.js는 "hey, execute this query"를 mysql로 보냅니다. 이 쿼리는 시간 (밀리 초)이 걸리기 때문에 node.js는 MySQL 비동기 라이브러리를 사용하여 쿼리를 수행합니다. 즉, 이벤트 루프로 돌아가서 mysql이 우리에게 돌아 오기를 기다리는 동안 다른 작업을 수행 합니다 . HTTP 요청을 처리하는 것과 같습니다.
편집 : 대조적으로 node.js 는 mysql이 돌아올 때까지 기다릴 수 있습니다 (아무것도하지 않음). 이를 동기 호출이라고합니다. 웨이터가 주문을 요리사에게 제출 한 다음 앉아서 요리사가 요리하는 동안 엄지 손가락을 돌리는 식당을 상상해보십시오. node.js 프로그램에서와 같이 레스토랑에서 그러한 행동은 어리석은 것입니다. 배고프고 서비스를 받아야하는 다른 고객이 있습니다. 따라서 한 명의 웨이터 (또는 node.js 프로세스)가 가능한 한 많은 사람들에게 서비스를 제공 할 수 있도록 가능한 한 비동기식이되기를 원합니다.
편집 완료
Node.js는 C 라이브러리를 사용하여 mysql과 통신하므로 기술적으로 이러한 C 라이브러리는 스레드를 생성 할 수 있지만 Javascript 내에서는 스레드로 아무것도 할 수 없습니다.
Ryan은 이것이 가장 좋다고 말했습니다. sync / async는 단일 / 다중 스레드와 직교합니다. 단일 및 다중 스레드의 경우 Reactor Pattern을 사용하여 등록 된 콜백을 호출하는 메인 이벤트 루프가 있습니다. 단일 스레드의 경우 콜백은 기본 스레드에서 순차적으로 호출됩니다. 다중 스레드의 경우 별도의 스레드에서 호출됩니다 (일반적으로 스레드 풀 사용). 실제로 얼마나 많은 경합이 있을지에 대한 질문입니다. 모든 요청이 단일 데이터 구조 (예 : 구독자 목록)에 대한 동기화 된 액세스를 필요로하는 경우 다중 스레드의 이점이 줄어들 수 있습니다. 문제에 따라 다릅니다.
구현에있어서 프레임 워크가 단일 스레드 인 경우 폴링 / 선택 시스템 호출을 사용할 가능성이 높습니다. 즉, OS가 비동기 이벤트를 트리거합니다.
'developer tip' 카테고리의 다른 글
node.js에서 비밀번호를 변경하고 로그 아웃하는 동안 JWT를 무효화하는 모범 사례? (0) | 2020.11.28 |
---|---|
명령 줄에 Maven 리포지토리를 추가 할 수 있습니까? (0) | 2020.11.28 |
JavaScript에서 "continue"문이 잘못된 이유는 무엇입니까? (0) | 2020.11.28 |
.NET 참조 소스의 개체로 캐스팅 (0) | 2020.11.28 |
생성자를 호출하지 않고 객체 인스턴스를 만드시겠습니까? (0) | 2020.11.28 |