2012-11-09 3 views
2

이것은 이전 질문 인 Node.js Non Blocking Nature을 따른 것입니다. Node.js에서 어떤 일이 일어나고 있는지 전혀 이해할 수 없다. 사용자가 큰 파일 업로드를 요청한 노드가 있다고 가정 해 보겠습니다. 이제 파일을 콜백으로 처리하도록 코드를 작성하여 비동기로 만듭니다. 다음에 어떻게 될까요? Node.js 앱이 처리해야하는 커다란 이벤트 목록에 콜백이 들어 갔으므로 지금까지는 차단되지 않았습니다. 그러나 어떤 시점에서 콜백은 이벤트 루프에서 빠져 나가고 코드는 실행을 시작합니다 (파일 업로드 또는 다운로드). 지금 뭐야? Node.js 앱이 지금 차단되고 있습니까? 그렇다면 앱의 성능을 어떻게 파 괴하지 않는가? 아니라면 누가 다른 이벤트와 요청간에 '점프'를 담당 할 것인가? 우리는 아파치 또는 유사한 서버에서 모든 스레드 (타이밍) 모든 스레드를 처리 할 수 ​​있도록 특별한 코드가 있다는 것을 알고 모든 스레드가 다른 모든 질식. 그러나 노드에서 이해할 수있는 이벤트 루프가 있습니다. 파일 I \ O가 완료되면 콜백이 준비 파일과 함께 마술처럼 반환됩니다. 그럼에도 불구하고 서버는 여전히 I \ O를 수행해야합니다. 이벤트 루프의 코드가 시간 초과 되었습니까? 예를 들어 서로 다른 이벤트 (콜백 등) 사이에서 점프를하면 요청이 다른 것을 막을 수 없습니까? 그렇다면 어떤 방식으로?Node.js 차단 자연

+0

작은 테스트 시스템을 설치하여 테스트 해 보았습니까? –

+0

업로드 된 파일을 처리하기 위해 어떤 API를 사용 하시겠습니까? –

+1

API 및 테스트 시스템 사용자가 없으며, 이는 멍청한 질문이므로 이벤트가 어떻게 처리되는지 이해하려고합니다. –

답변

1

필자는이 주제가 철저한 읽기에 충분할 정도로 복잡하고 (적어도 신규 사용자에게는) 최소한 5 줄의 대답을 읽으면 이해할 수 없다고 생각합니다. 이 자료는 내가 찾은 가장 좋은 자료입니다 http://www.theserverside.com/discussions/thread.tss?thread_id=61693. 그는 노드에 대해서 그렇게 생각하지 않습니다.js하지만 그는 그것을 설명하기 위해 많은 노력을 기울이고 있습니다. 읽을만한 가치가있는 제 의견입니다.

9

모든 입출력은 다중 스레드를 사용하여 node.js에 의해 내부적으로 처리됩니다. 단일 스레드, 이벤트 기반 및 비동기 인 I/O 기능에 대한 프로그래밍 인터페이스입니다.

그래서 예제의 큰 업로드는 node.js가 관리하는 별도의 스레드에 의해 수행되며 스레드가 작업을 완료하면 콜백이 이벤트 큐에 놓입니다 (단일 JavaScript 스레드에서 실행 됨) .

단일 JavaScript 스레드는 큐의 헤드에서 콜백을 가져 와서 큐가 비게 될 때까지 순차적으로 실행하는 것으로 생각하십시오. 그런 다음 내부 I/O 스레드 중 하나가 대기열에 새로운 콜백을 넣을 때까지 대기합니다.

This article은 관련된 세부 항목 인 process.nextTick에 대해 설명하므로 이러한 세부 정보 중 일부를 이해할 수있었습니다. 비록 Node.js를

+0

당신은 더 자세히 설명 할 수 있습니까? 아파치와 이것의 차이점은 무엇입니까? 아파치 - 요청 당 스레드. 여기 - 콜백 당 스레드? 성능 향상은 어떤가? –

+1

@ user1032663 아파치에서는 각 요청 처리기가 자체 스레드에서 실행되며 node.js에서는 모든 요청 처리기가 동일한 스레드에서 실행됩니다. – JohnnyHK

+0

각 Node.js 콜백 \ 이벤트에 대해 새 스레드가 열리는 것으로 생각하십니까? –

3

종종 「비 차단」으로 기재하고, 무슨 정말 의미하는 것은 O를 I에 /차단하지 않는다는 점이다. 프로세서 집약적 인 일을해야한다면 다른 것들도 기다려야합니다. 그러나 파일 시스템이나 네트워크에서 데이터가 반환되기를 기다리는 중일 경우 노드가 프로세스를 차단하지 않습니다.

파일 업로드 속도가 느린 경우 데이터가 처리 될 때 주기적으로 처리해야합니다 (콜백을 호출 할 수도 있지만 콜백을 호출 할 수있을 때까지 해당 데이터를 저장할 수도 있음).). 그러나 컴퓨터는 빠르며 어떤 일이 일어나 든간에 모든 의도와 목적을 위해 즉각적입니다. 네트워크 운영이 상대적으로 느리다고 우려합니다. Php와 같은 언어에서는 일반적으로이 작업이 완료 될 때까지 함수가 반환되지 않으며 그 때까지 해당 스크립트에서 수행 할 수있는 작업은 없습니다. 한편 CPU는 유휴 상태 일 수 있습니다 ... 네트워크를 통해 데이터가 들어올 때까지 기다리는 것입니다. 반면, Node는 콜백이 호출되기 전에 CPU를 다른 용도로 사용합시다.

다른 사람들도 언급했듯이 두드러기에서 스레드가 발생할 수 있습니다. 또는 노드가 비 차단 C++ 함수를 사용하여 파일 및 네트워크 작업을 내부적으로 구현할 수 있기 때문에 존재하지 않을 수도 있습니다. 상관 없어요. 중요한 것은 I/O 작업이 앱 내에서 다른 일이 일어나지 않도록 차단한다는 것입니다.