2013-06-20 4 views
6

이전에 나는 this answer.이라는 질문에 응답했다. 내가 게시 한 예제에서, bcrypt 노드 모듈에서 동기식 버전의 호출을 사용했다. 동기식 버전의 호출을 주로 사용하기로 결정했는데 응답 성을 좀 더 깔끔하게 보일 것으로 생각했기 때문에 bcrypt가 I/O 경계 대신 CPU 및 메모리를 많이 사용하기 때문에 성능에 영향을 미치지 않을 것이라고 생각했습니다. 브라우저가하는 것처럼 노드가 거의 모든 코드를 단일 스레드에서 실행하고 I/O 및 데이터베이스 액세스와 같은 용도로만 백그라운드 스레드를 사용한다는 사실을 알고있었습니다. 이것은 CPU 부하가 많은 작업이 서버를 "차단"한다는 사실을 알게 해주었습니다. 작업 부하를 줄이려는 다른 스레드가 없었기 때문입니다.node.js의 비동기 프로그래밍으로 CPU 바인딩 작업 속도가 빨라 집니까?

내 대답에 대한 의견은 제 가정이 잘못되었다는 것을 나타내며, 일부 연구를 통해 node.js가 이런 종류의 문제를 처리하는 방법에 대해 실제로 이해하지 못했다는 사실을 깨달았습니다. node.js의 비동기 프로그래밍으로 인해 CPU 및 메모리 사용량이 증가합니까? 그렇다면 어떻게 작동합니까?

+0

"node.js의 비동기 프로그래밍으로 인해 CPU 및 메모리 사용량이 증가합니까?" --- 그것은 그것이하는 것처럼 가장합니다. 모래 시계처럼 OS를 빠르게 볼 수 있습니다. – zerkms

답변

7

모듈 구현 방법에 따라 다릅니다.

모듈이 스레딩을 지원하지 않고 구현 된 경우 예에서 CPU 바운드 처리를 비동기 적으로 수행 할 수 없습니다. 일부 함수는 콜백과 내보기를 비동기식으로 제공하지만 실제로는 그렇지 않습니다. 이들은 실제로 동기식으로 실행되고 이벤트 루프를 차단합니다. 자바 스크립트에서 이것의 예는 Array.forEach()입니다.

그러나 모듈은 백그라운드 스레드에서 처리를 수행하도록 구현 될 수 있습니다. 어떤 경우에는 진정으로 비동기이며 CPU 바운드 작업 속도를 높일 수 있습니다. 적어도 백그라운드 스레드가 결과를 계산하는 동안 들어오는 요청을 처리하기 위해 이벤트 루프를 비울 수 있습니다.

이 예는 노드의 자체 암호화 모듈에있는 crypto.pbkdf2() 기능입니다.

그러나 node.js가 단일 스레드에서 실행될 때 어떻게 모듈이 다른 스레드에서 코드를 실행할 수 있습니까?

원래 구현 된 방식은 모듈이 자바 스크립트로 작성되지 않고 대신 C/C++로 작성되었으며 addons API를 통해 node.js에 인터페이스된다는 것입니다.

요즘은 자바 스크립트 모듈과 함수조차도 스레드 및/또는 프로세스를 생성 할 수 있습니다. 노드는 노드 프로세스의 마스터/슬레이브 클러스터를 설정하는 클러스터라는 실험적 모듈을 가지고 있습니다. 그런 다음 모듈 또는 코드는 작업자 프로세스에서 CPU 바운드 작업을 실행하여 주 노드 프로세스를 해제하여 이벤트 루프를 처리 할 수 ​​있습니다. npm에는 몇 가지 스레딩 모듈이 있습니다. npmjs.org에서 "thread"를 검색하십시오.

예를 들어 CPU 바인딩 작업을보다 빠르게 실행하거나 적어도 비동기 적으로 실행하여 기본 이벤트 루프를 차단하지 않을 수 있습니다.

+1

좋은 답변입니다. 소스 코드를 살펴본 후에, 내가 권장했던 bcrypt 모듈은 실제로 C/C++ 코드를 사용하여 계산을 수행하고 비동기 호출에 의해 속도가 빨라진다는 것을 알게되었습니다. 나는 원래의 대답에 대한 주석가가 맞았다 고 생각하고, 기본적으로 비동기 호출을 사용하는 것이 더 좋을 것이고 필요할 때 동기식 호출 만 선택하는 것이 더 나을 것입니다. – TwentyMiles

관련 문제