2012-07-15 3 views
3

나는 Node.js를 배울하려고하고 이해 포인트의 일부 :"모든 것이 코드를 제외하고는 병렬로 실행됩니다.".. 무엇을 기다리시겠습니까?

  1. Node.js를 각 요청에 대해 별도의 프로세스를 생성 does'nt는 대신 모든 요청을 처리 한 과정이다.

  2. 이것은 비동기식이므로 오래 지속되는 프로세스에 콜백을 첨부하고 작업이 끝날 때까지 기다리지 않고 나머지 작업을 계속할 수 있습니다. 난 정말 이해가 안 무엇

Understanding node.js에서 저자의 지점입니다 - "모든 코드를 제외하고 병렬로 실행됩니다." 나는 그것을 설명하는 비유와 코드를 이해했지만 여전히 "Everything"과 "code"의 구분이 무엇인지 알지 못합니다. 나는 node.js에 관해서 더 자주 들었다.

동시에 하나의 동시 연결에 대한 메모리 오버 헤드가 8KB 정도로 낮을 수 있지만 CPU로드는 어떨까요? node.js는 PHP + Apache와 비교하여 덜 효과적입니까?

+0

HTTP가 Node.js 응용 프로그램과 아무 관계가 없다는 것을 이해하면 도움이 될 것이라고 생각합니다. 노드 애플리케이션은 V8에서 실행되는 JavaScript입니다. 그들은 웹과 관련이 전혀 없습니다! 일반적으로 HTTP 요청에 사용되지만 HTTP 요청과 관련이 없습니다. – Brad

답변

5

Node.js는 응용 프로그램에서 JavaScript를 실행할 때마다 단일 스레드를 사용합니다. 비동기 작업 (네트워크, 파일 시스템 등)은 모두 자동으로 별도의 스레드에서 처리됩니다. 즉, 리소스를 잠글 때 발생하는 모든 문제에 대해 걱정할 필요없이 멀티 스레드 응용 프로그램의 유용성을 많이 얻게됩니다.

노드는 모든 작업을위한 도구가 아닙니다. IO 바인딩 된 응용 프로그램에 이상적입니다. 예를 들어, 응용 프로그램이 템플리트를 처리하는 데 많은 양의 작업이 필요하고 그렇지 않은 경우 Node는 아마도 사용자를위한 것이 아닙니다. 대신에 데이터를 뒤적 거리게하면 노드가 매우 효과적 일 수 있습니다.

노드가 종종 Apache와 같은 서버보다 빠르다는 이유는 요청을 처리하기 위해 스레드와 모든 리소스를 생성하지 않기 때문입니다. 아파치에서, 대부분의 시간 동안, 쓰레드 처리 요청은 네트워크 나 파일 시스템 데이터를 기다리고있다. 이 작업을 수행하는 동안 자원을 낭비합니다. Node를 사용하면 응용 프로그램에서 하나의 스레드 만 해당 요청을 처리합니다. 다시 한 번 말하지만,이 작업은 여러 가지 작업에 유용하지만, 처리해야 할 작업이 많은 경우 Node는 실제로 이러한 상황에서 한 번에 하나의 요청 만 처리 할 수 ​​있기 때문에 효과적이지 않습니다.

이 비디오는 설명의 꽤 좋은 직장을 수행합니다 http://www.youtube.com/watch?v=F6k8lTrAE2g&feature=youtube_gdata

+0

그래서 각 HTTP 요청마다 별도의 스레드가 생성되지만 JS는 하나의 스레드에서만 실행됩니다. 다른 연결 일지라도 – Shubham

+0

@Shubham, 아니요, 각 HTTP 요청마다 별도의 스레드가 생성되지 않습니다. 그러나 데이터를 다시 보내면 별도의 스레드가 백그라운드에서 만들어져 버퍼링과 해당 데이터가 처리되지 않습니다. – Brad

+0

좋은 질문. 두 건의 요청이 정확히 같은 시간에 전송되면 어떻게됩니까? 나는 그 (것)들을 handeling 다만 1 개의 과정이다는 것을 의미 하는가? (* 혼란스러운 *) – Shubham

2

모든 것이 코드를 제외하고는 병렬로 실행됩니다.

그것은 당신이 전체 노드 응용 프로그램이 중지됩니다 당신의 코드 어디에서나 while(true){}

을 할 경우 의미한다. 작성한 코드가 실행되는 동안 다른 것은 수행하지 않습니다. 요청은 처리되지 않으며 응답은 반환되지 않으며 아무 것도 반환되지 않습니다. 당신은 극단적으로 노드에서 CPU를 먹지 않도록주의해야합니다.

하지만 CPU 부하는 어떻습니까?

완전히 응용 프로그램과로드의 특성에 따라 다릅니다. 앱이 바쁠 경우 더 많은 CPU가 사용됩니다.

1

"모든 것"은 코드 이외의 모든 것을 말합니다. 예를 들어, HTTP를 처리하는 항목. 같은 말을하는 또 다른 방법은 "코드가 node.js가 비동기 적으로 완료 되었기 때문에 TCP를 통해 데이터를 보내는 것과 같이 물건을 처리 할 때까지 기다리지 않는다"는 것입니다.

두 번째 질문에 대답하기 위해 어떤 CPU 부하가 적은지 알지 못합니다. 비슷한 것으로 추측합니다. Node.js의 장점은 전술 한 비동기로 인해 CPU가 더 잘 활용된다는 것입니다.

2

가 중간에 교통 경찰 바쁜 교차로를 상상해보십시오. 경찰이 제대로 일하면서 수백 대의 차량이 매우 빠르고 효율적인 교차로를 통과 할 수 있습니다.

트래픽을 처리하는 동안 경찰이 셀에서 SMS 메시지를 수신하고 응답하기 시작하면 상황이 실제로 빠져 나올 수 있습니다.

교통 경찰은 node.js 앱이며 SMS를 보내는 데 소요되는 시간은 작성자가 "내 코드"라고 말한 것입니다.

다른 말로하면 node.js 성능이 교통 경찰관으로 사용할수록 더 빛날 것입니다. 데이터를 가져 와서 누르는 것 (예 : 숫자 목록 정렬, html 템플릿 렌더링 등) 이외의 작업을 수행할수록 새로운 연결을 신속하게 수락하고 처리 할 수있는 능력이 더 빨리 저하됩니다.

+0

그래서 각 동시 요청에 많은 양의 작업이 필요하다면 node.js가 좋습니다 - 대형 데이터베이스를 처리하거나 매우 긴 스크래핑 작업을합니까? – Shubham

+0

@Shubham, 데이터베이스 작업은 데이터베이스 서버에서 처리해야 응용 프로그램이 차단되지 않습니다. 스크래핑에 대한 HTTP 요청도 비동기 적으로 발생하므로 해당 리소스가 다운로드되는 동안 응용 프로그램을 차단하지 않습니다. 응용 프로그램에서 스크래핑 작업에 대한 데이터를 처리하는 작업은 완료 될 때까지 차단하지만 블록을 문제없이 처리 할 수 ​​있도록 코드를 작성해야합니다. – Brad

+0

유추 : D @Shubham과 마찬가지로 이벤트 루프를 돌릴 것으로 예상되는 각 호출에 콜백을 전달해야합니다 (예 : 데이터베이스 액세스). 이 콜백은 데이터에 의존하는 응용 프로그램의 일부를 포함하며 데이터를 사용할 수있을 때 호출됩니다. 이 프로그래밍 스타일의 추악한 결과는 "콜백 - 지옥"입니다. – MauganRa

관련 문제