2012-05-30 2 views
5

GET 매개 변수를 디코딩하고 인코딩 된 형식으로 데이터를 반환하는 웹 서버에 nodejs를 사용하고 있습니다. decode/encode는 nodejs의 crypto 모듈을 사용하여 수행됩니다. 단일 요청을 처리하는 데 소요되는 시간이 충분히 빠르지 만 이벤트 루프를 차단하면 서비스가 동시성이 떨어지게됩니다.nodejs에서 CPU 바운드 작업을 구현하는 방법

내 요구 사항은 간단합니다. 이벤트 루프 외부에서 인코딩/디코딩 기능을 사용하십시오.

  1. 별도의 프로세스 (child_process 또는 클러스터)

이 유일하게이 목적을 위해 별도의 프로세스가 될 수 있습니다,하지만 인코딩 이후/디코드는 자식 프로세스에서 차단 될이 자식 프로세스를 중지합니다 새로운 메시지를받습니다. 즉, 자식 프로세스가 단일 스레드 일 때 두 문자열이 인코딩 될 때 절대로 상황이 발생하지 않습니다.

    각 요청
  1. 별도의 스레드 (스레드-A-고골 또는 섬유 또는 노드 webworker)

에서, 인코딩/디코딩 동작을 수행하는 각각의 요청을위한 별도의 쓰레드를 생성하지만 없음 모듈이 예상대로 작동하는 것처럼 보입니다. 즉, threads-a-gogo가 npm을 통해 설치되지 않고 fiber가 run(), node-webworker not working에 개별 스레드를 생성하지 않았습니다.

누군가 비슷한 문제가 있거나 간단한 메시지 전달을 사용하여 nodejs에서 스레드를 쉽게 만들 수있는 방법이 있습니까?

+0

: 클러스터와

http://nodejs.org/api/cluster.html#cluster_cluster_fork_env

, 그것은 뭔가를 작동합니다 귀하의 블로킹/액티브 대기를 패시브 이벤트 기반 스타일로 바꾸는 것 – ControlAltDel

+0

나는 CPU가 바운드 작업과 노드가 잘 맞지 않는다고 생각합니다. 그렇다면 예를 들어 Java를 사용하는 것이 더 좋으며 node/java가 효과적으로 통신 할 수 있습니다. – Alfred

+0

nodejs의 CPU 바운드 작업이 끔찍하다는 것을 알고 있기 때문에 내장 된 암호화 모듈이이를 별도로 처리 할 것으로 예상됩니다. 하지만 Java/C에서 중계하는 것 외에 다른 옵션이 없습니까? – mdprasadeng

답변

1

이것은 노드의 하위 프로세스에 내장되어 있습니다. 여기 문서 : 또한 클러스터 사용할 수

http://nodejs.org/api/child_process.html#child_process_child_send_message_sendhandle

: 대답은 # 당신이 필요로하는 일에

if (cluster.isMaster) { 
    var worker = cluster.fork(); 
    worker.send('encodeThisString'); 

} else if (cluster.isWorker) { 
    process.on('message', function(msg) { 
    var encrypted = crypto.doSomeEncryption(msg); 
    process.send(encrypted); 
    }); 
} 
관련 문제