PHP (또는 Java/ASP.NET/Ruby) 기반 웹 서버에서 모든 클라이언트 요청이 새 스레드에서 인스턴스화됩니다. 그러나 Node.js에서 모든 클라이언트는 동일한 스레드에서 실행됩니다 (동일한 변수를 공유 할 수도 있습니다!). I/O 작업은 이벤트 기반이므로 주 스레드 루프를 차단하지 않습니다.Node.js가 단일 스레드 인 이유는 무엇입니까?
내가 이해하지 못하는 이유는 노드 작성자가 단일 스레드로 선택했기 때문입니까? 그것은 일을 어렵게 만듭니다. 예를 들어 메인 스레드를 차단하고 새로운 클라이언트 요청이 차단되어 CPU 집약적 인 기능을 실행할 수 없으므로 프로세스를 생성해야합니다. 즉, 별도의 JavaScript 파일을 작성하고 다른 노드 프로세스를 실행해야합니다.). 그러나 PHP에서 CPU 사용량이 많은 작업은 다른 클라이언트를 차단하지 않습니다. 각 클라이언트가 다른 스레드에 있다고 언급했기 때문입니다. 다중 스레드 웹 서버에 비해 장점은 무엇입니까?
참고 :이 문제를 해결하기 위해 클러스터링을 사용했지만 꽤 좋지 않습니다.
나는 최근에 노드 뒤에있는 이론을 설명하는 좋은 비디오 (29 분)를 보았다. 나는 그 사람이 CPU 집약적 인 작업에 대해 이야기하고 그것들을 처리하는 방법을 간략하게 생각한다고 생각한다 : http://www.youtube.com/watch?v=L0pjVcIsU6A – whirlwin
당신은 이것을 알 수 있지만 분명히 알 수있다. Node.js는 단일 - 스레드. JavaScript 코드는 단일 스레드로 실행되지만 IO 작업 및 플러그인이 수행 할 수있는 다른 작업은 스레드 풀에서 부족합니다. Node.js는 멀티 스레드 코드를 다룰 필요없이 멀티 스레딩의 많은 이점을 제공합니다. 또한 Node.js 기여자는 JavaScript의 단일 스레드 특성을 선택하지 않았으며 JavaScript 작성자도이를 수행했습니다. JS가 멀티 스레드 컨텍스트에서 작동 할 수있는 방법을 생각할 수는 없지만 V8은 Node.js가 JavaScript 엔진으로 사용하는 방식으로 작성되지 않습니다. – Brad
V8은 C++를 통해 V8을 사용하기 때문에 단순히 인터프리터였습니다. 또한, 네, 이벤트가 스레드라는 것을 알고 있지만 메인 루프에 대해 이야기하고 있습니다. 또한 표준 웹 서버 (예 : java)는 웹 서버가 멀티 스레딩을 처리해야만합니다. – foreyez