2013-07-31 2 views
182

PHP (또는 Java/ASP.NET/Ruby) 기반 웹 서버에서 모든 클라이언트 요청이 새 스레드에서 인스턴스화됩니다. 그러나 Node.js에서 모든 클라이언트는 동일한 스레드에서 실행됩니다 (동일한 변수를 공유 할 수도 있습니다!). I/O 작업은 이벤트 기반이므로 주 스레드 루프를 차단하지 않습니다.Node.js가 단일 스레드 인 이유는 무엇입니까?

내가 이해하지 못하는 이유는 노드 작성자가 단일 스레드로 선택했기 때문입니까? 그것은 일을 어렵게 만듭니다. 예를 들어 메인 스레드를 차단하고 새로운 클라이언트 요청이 차단되어 CPU 집약적 인 기능을 실행할 수 없으므로 프로세스를 생성해야합니다. 즉, 별도의 JavaScript 파일을 작성하고 다른 노드 프로세스를 실행해야합니다.). 그러나 PHP에서 CPU 사용량이 많은 작업은 다른 클라이언트를 차단하지 않습니다. 각 클라이언트가 다른 스레드에 있다고 언급했기 때문입니다. 다중 스레드 웹 서버에 비해 장점은 무엇입니까?

참고 :이 문제를 해결하기 위해 클러스터링을 사용했지만 꽤 좋지 않습니다.

+11

나는 최근에 노드 뒤에있는 이론을 설명하는 좋은 비디오 (29 분)를 보았다. 나는 그 사람이 CPU 집약적 인 작업에 대해 이야기하고 그것들을 처리하는 방법을 간략하게 생각한다고 생각한다 : http://www.youtube.com/watch?v=L0pjVcIsU6A – whirlwin

+18

당신은 이것을 알 수 있지만 분명히 알 수있다. Node.js는 단일 - 스레드. JavaScript 코드는 단일 스레드로 실행되지만 IO 작업 및 플러그인이 수행 할 수있는 다른 작업은 스레드 풀에서 부족합니다. Node.js는 멀티 스레드 코드를 다룰 필요없이 멀티 스레딩의 많은 이점을 제공합니다. 또한 Node.js 기여자는 JavaScript의 단일 스레드 특성을 선택하지 않았으며 JavaScript 작성자도이를 수행했습니다. JS가 멀티 스레드 컨텍스트에서 작동 할 수있는 방법을 생각할 수는 없지만 V8은 Node.js가 JavaScript 엔진으로 사용하는 방식으로 작성되지 않습니다. – Brad

+1

V8은 C++를 통해 V8을 사용하기 때문에 단순히 인터프리터였습니다. 또한, 네, 이벤트가 스레드라는 것을 알고 있지만 메인 루프에 대해 이야기하고 있습니다. 또한 표준 웹 서버 (예 : java)는 웹 서버가 멀티 스레딩을 처리해야만합니다. – foreyez

답변

215

Node.js는 비동기 처리의 실험으로 명시 적으로 만들어졌습니다. 이론은 단일 스레드에서 비동기 처리를 수행하면 일반적인 웹 기반로드보다 일반적인 스레드 기반 구현보다 더 많은 성능과 확장 성을 제공 할 수 있다는 이론입니다.

그리고 그거 알아? 제 생각에는 이론이 뒷받침되었습니다. CPU 집약적 인 작업을 수행하지 않는 node.js 응용 프로그램은 Apache 또는 IIS 또는 다른 스레드 기반 서버보다 수천 개의 동시 연결을 실행할 수 있습니다.

단일 스레드, 비동기 성질로 인해 작업이 복잡해집니다. 솔직히 말해서 스레딩보다 복잡하다고 생각합니까? 하나의 경쟁 조건으로 인해 한 달 전체가 망가질 수 있습니다! 또는 어딘가 설정으로 인해 스레드 풀을 비우고 응답 시간이 느려지는 것을 조심하십시오! 교착 상태, 우선 순위 반전 및 멀티 스레딩과 관련된 다른 모든 선회는 말할 것도 없습니다.

결국, 나는 보편적으로 더 좋거나 나쁘지 않다고 생각합니다; 그것은 다르다. 때로는 더 좋고 때로는 그렇지 않다. 작업에 적합한 도구를 사용하십시오.

+18

그러나 웹 서버는 일반적으로 CPU 집약적 인 작업을 수행합니다. 데이터베이스를 페치하는 것이 아닙니다. 우리는 가져 오는 것을 처리해야하고 클라이언트에게 제공하기 전에 시간의 비즈니스 로직을 많이해야합니다. – foreyez

+17

그래서 노동자들을 산란시킬뿐입니다. 이것이 Node.js의 전체 내용입니다. 무거운 물건은 다른 프로세스에서 실행될 수 있으며 가벼운 콜백으로 결과를 처리합니다. – MaiaVictor

+5

그 문제는 작업자별로 실행중인 운영 체제 수준 프로세스가 있다는 것입니다. "ps"명령을 사용하여 해당 작업을 볼 수 있습니다. 따라서 잠재적으로 한 번에 컴퓨터에서 실행되는 수천 개의 프로세스를 의미합니다. – foreyez

24

간단히 말하면, 노드는 내부적으로 단일 스레드 인 V8에서 가져옵니다. CPU를 많이 사용하는 작업에 대한 제약 조건을 해결할 수있는 방법이 있습니다. 한 지점에서

는 (0.7) 저자는 계산의 여러 스레드를 구현하는 방법으로 분리를 소개했지만, 궁극적으로 제거 : https://groups.google.com/forum/#!msg/nodejs/zLzuo292hX0/F7gqfUiKi2sJ

+0

"isolate"에 대한 자세한 정보가 있습니까? – Pacerier

47

서버에 대해 "하나 개의 스레드의 요청에 따라"모델 문제 이벤트 루프 스레드 모델에 비해 여러 시나리오에서 확장 성이 좋지 않다는 것입니다.

일반적으로 I/O가 많은 시나리오에서는 I/O가 완료 될 때까지 대부분의 시간이 소요됩니다. 이 시간 동안 "요청 당 한 스레드"모델에서 스레드 (예 : 메모리)에 연결된 리소스는 사용되지 않고 메모리가 제한 요소입니다. 이벤트 루프 모델에서 루프 스레드는 처리 할 다음 이벤트 (I/O 완료)를 선택합니다. 따라서 쓰레드는 항상 바쁘다 (물론 제대로 프로그래밍한다면).

모든 새로운 것의 이벤트 루프 모델은 빛나는 듯하며 모든 문제에 대한 솔루션이지만 사용할 모델은 해결해야 할 시나리오에 따라 달라집니다. 집중적 인 I/O 시나리오 (예 : 프록시)를 사용하는 경우 이벤트 기반 모델이 규칙을 적용하는 반면 동시 프로세스 수가 적은 CPU 집중 시나리오는 스레드 기반 모델에서 가장 잘 작동합니다.

현실 세계에서 대부분의 시나리오는 중간에 약간 있습니다. 올바른 아키텍처를 찾기 위해 확장 성의 실제 요구와 개발 복잡성의 균형을 맞출 필요가 있습니다 (예 :CPU를 많이 사용하는 작업을 위해 백엔드에 위임하는 이벤트 기반 프론트 엔드를 보유하고 있어야합니다. 프런트 엔드는 작업 결과를 기다리는 자원을 거의 사용하지 않습니다.) 분산 시스템과 마찬가지로 작동시키기 위해서는 약간의 노력이 필요합니다.

아무런 노력없이 어떤 시나리오에도 적합한 은색 탄환을 찾고 있다면 발에 총알이 생길 것입니다.

+7

Node.js는 v8 다중 스레딩 지원이 없기 때문에 이벤트 전용 처리로 제한됩니다. 글쎄, 자바 스크립트 언어 자체가 필요한 기능이 부족하므로 구현이 까다로워 질 것이다. 그것이 Node.js의 주범입니다. 제 의견으로는. 다른 언어에서는 원하는 것을 선택할 수 있습니다. 또는 Java NIO와 같은 두 모델의 일부 하이브리드. – FrameGrace

+1

@Kazaag, 현대 웹 서버 **는 ** 스레드 풀을 유지 관리합니다 **. 그들은 페이지 당 새로운 쓰레드를 덤벙하게 생성하지 않습니다. 그것들은 오래된 웹 서버입니다. – Pacerier

+0

@Pacerier 새로운 스레드가 생성되었다고 말한 적은 없지만 요청이 완료 될 때까지 각 스레드는 하나의 요청에 할당됩니다. – Kazaag

관련 문제