Python과 Ruby는 또한 그러한 프레임 워크를 가지고 있지만 동기 코드를 포함하는 라이브러리는 필연적으로 실제로 사용되기 때문에 자라지 않았습니다. Node.js 이전에 JavaScript의 서버 측 프로그래밍은 거의 비워 졌으므로 Node.js는 모든 IO가 비동기식 인 코드 라이브러리를 설정할 수있었습니다.
대부분의 웹 애플리케이션의 병목 현상은 IO, 즉 디스크를 읽고 쓰고, 네트워크를 읽고 쓰고, 데이터베이스를 읽고 쓰는 것입니다. 이 기간을 기다리는 데 사용하는 전략은 성능 향상의 핵심 요점이되었습니다.
PHP의 전략 : 여러 프로세스를 실행하고 IO가 직접 완료 될 때까지 기다립니다. 단점 : 다중 프로세스는 여러 메모리를 소비하여 프로세스간에 데이터를 공유하기가 어렵습니다.
C/C ++ 공통 전략 : 멀티 스레딩 실행 및 프로그램은 잠금 상태 자체를 유지합니다. 단점 : 개발 비용이 높고 실수가 쉬우 며 디버깅하기가 어렵습니다.
Python (Tornado) : 단일 프로세스에서 여러 요청이 차례로 실행되며 IO를 만나면 다른 요청으로 전환합니다. 단점 : 단일 요청의 경우 시간이 여전히 가장 효율적으로 사용되지 않습니다.
"가장 효율적으로 시간을 사용하십시오"는 무엇입니까? 예를 들어, 이제 두 개의 관련이없는 데이터베이스 쿼리가 있습니다. PHP에서는 하나가 일반적으로 먼저 실행되며, 두 번째는 실행이 완료된 후에 실행됩니다 (총 시간은 A + B입니다). 분명히 이것은 가장 효율적이지 않습니다. 두 쿼리는 동시에 실행해야하며 시간은 MAX (A, B)입니다.
Python 및 Multithreading을 지원하는 다른 언어의 문제점은 언어 수준에서 프로그래머가 가상 머신에게 두 개의 작업을 동시에 실행해야한다고 말하는 것은 어렵다는 것입니다. 방법이 있더라도 매우 번거 롭습니다. 대부분의 사람들은 사용하기에는 너무 게으르다 (사용 가치가 없음). Node.js는 모든 IO 실행을 비동기 적으로 강제로 강요하기 때문에 Node.js 프로그래머도 익숙하다고 말할 수 있습니다. 일부 라이브러리와 함께 코드 가독성을 향상시키기 위해 (Promise, Async), 관련없는 작업을 병렬로 쉽게 실행할 수 있습니다.
위의 내용은 비동기 IO의 구현에 대한 이야기입니다. 따라서 비동기 IO의 장점은 어디에 반영됩니까? 실제로 비동기 IO는 서버의 압력을 마술처럼 줄일 수 없습니다. 서버를 추가하려면 여전히 서버를 추가해야하지만 비동기 IO는 단일 요청 시간을 줄이고 단일 요청에서 의미없는 대기 시간을 제거합니다. 따라서 단위 시간 내에 처리 된 요청은 변경되지 않았지만 각 요청의 처리 시간이 줄어 듭니다. 이러한 관점에서, 서버는 일부 리소스를 저장합니다. 즉, 요청 된 각 연결에 의해 소비되는 메모리를 유지합니다.