클러스터를 사용하여 노드 서버를 다중 스레드 server_node.js로 확장하세요.

WBOY
풀어 주다: 2016-05-16 16:31:48
원래의
1304명이 탐색했습니다.

nodejs를 사용하는 친구들은 node가 단일 스레드라는 것을 모두 알고 있습니다. 즉, 8코어 CPU에서 실행되고 코어 1개의 컴퓨팅 성능만 사용할 수 있다는 뜻입니다.
단일 스레딩은 항상 노드에 대한 비판이었지만 버전 0.6의 클러스터 도입으로 이러한 상황은 바뀌었습니다. 개발자는 클러스터를 사용하여 노드 서버를 멀티 스레드 서버로 쉽게 확장할 수 있습니다.

클러스터란

클러스터는 노드에서 제공하는 멀티스레딩 라이브러리입니다. 사용자는 이를 사용하여 여러 스레드를 생성할 수 있습니다. 스레드는 이 포트에 대한 외부 요청이 있는 경우 해당 요청을 임의 스레드로 전달합니다. . 각 노드 스레드는 수십 메가바이트의 메모리를 차지하므로 PHP처럼 각 요청에 대해 스레드를 생성할 수 없습니다. 일반적으로 생성되는 스레드 수는 최대 CPU 코어 수를 초과하지 않습니다.

코드 복사 코드는 다음과 같습니다.

var 클러스터 = require('클러스터');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
// 포크 작업자.
for (var i = 0; i ​ Cluster.fork();
}

Cluster.on('exit', function(worker, code, signal) {
console.log('worker ' 작업자.process.pid ' 사망');
});
} 그 밖의 {
// 작업자는 모든 TCP 연결을 공유할 수 있습니다
// 이 경우에는 HTTP 서버입니다
http.createServer(함수(req, res) {
res.writeHead(200);
res.end("hello worldn");
}).listen(8000);
}

위 코드에서 볼 수 있듯이 프로그램이 실행될 때 Cluster.isMaster는 true로 설정됩니다. false로 설정됩니다. 우리는 주로 이 변수를 사용하여 현재 스레드가 하위 스레드인지 여부를 결정합니다.

또한 각 하위 스레드가 생성된 후 충돌을 일으키지 않고 포트 8000을 수신한다는 것을 알 수 있습니다. 이는 클러스터 공유 포트의 기능입니다.

스레드 간 통신

스레드가 생성되면 서로 메모리나 데이터를 공유하지 않습니다. 모든 데이터 교환은 작업자.send 및 작업자.on('message', handler)을 통해 메인 스레드에서만 처리될 수 있습니다. 다음은 브로드캐스트 시스템의 예입니다.

코드 복사 코드는 다음과 같습니다.

var 클러스터 = require('클러스터');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {

var Workers=[];
//새 작업자 생성
함수 newWorker(){
var 작업자=cluster.fork();

//정보를 듣고 방송형이면 방송으로 판단
작업자.on('메시지', 함수(msg) {
If(msg.type=='방송'){
        var event=msg.event;
//이 방송을 모든 근로자에게 보냅니다
Workers.forEach(함수(작업자){
작업자.send(이벤트);
         })
}
});
복귀근로자;
}

for (var i = 0; i Workers.push(newWorker());
}

Cluster.on('online',function(작업자){
console.log('%d 작업자가 온라인 상태입니다.',worker.id);
})
} 그 밖의 {
var 작업자=cluster.worker;

//Broadcast는 방송형 메시지를 보내는 것이고, Event는 방송 내용
작업자.브로드캐스트=함수(이벤트){
작업자.send({
유형:'방송',
       이벤트:이벤트
});
}

//여기서는 Worker.on을 이용하여 반환된 정보를 모니터링할 수 없는 것 같습니다
process.on('메시지',function(이벤트){
console.log('worker: ' Worker.id '가 ' event.workerId에서 이벤트를 수신했습니다.);
})

//브로드캐스트 보내기
작업자.방송({
메시지:'온라인',
작업자ID:worker.id
})
}

주의가 필요한 문제

위에서 언급했듯이 스레드 간 데이터 공유는 불가능하며, 모든 데이터 교환은 스레드 간 통신을 통해서만 가능합니다. 교환된 데이터는 모두 직렬화 가능하므로 함수, 파일 설명자, HttpResponse 등은 전달할 수 없습니다.

클러스터를 사용하는 경우 프로그램 설계 중에 데이터 교환 문제를 고려해야 합니다. 내 자신의 접근 방식은 Redis에 세션과 같은 데이터를 저장하는 것이며 각 스레드는 데이터에 액세스하는 작업을 잘 수행합니다. 노드 메모리에서.

마지막으로, 클러스터는 현재 공식적으로 Node에 의해 Experimental로 표시되어 있으며 API는 향후 변경될 수 있습니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!