2012-05-23 3 views
0

nodejs에서 시간 지정 응용 프로그램을 만들어야하는데, 사용자는 매일, 매주 및 매월 설정할 수 있습니다. 처음으로 문질러서는 다음과 같이 만드는 것이 었습니다 :nodejs 타이머 성능

socket.on("connect") 
{ 
    client.on("authenticate") 
    { 
    var frequency = GetTimersForUser(client); 
    var timersInMilliseconds = ConvertFrequencyToMS(frequency); 
    var nextInMS = GetLower(timersInMilliseconds); 
    setTimeout("timedCount()",nextInMS); 
    } 
} 
timedCount() 
{ 
    cancelTimer; 
    client.emit("poke"); 
    var frequency = GetTimersForUsers(client); 
... 
    setTimeout("timedCount()",nextInMS); 
} 

을하지만, 이것은 (클라이언트가 연결되어있는 경우) 타이머 만 접속 후 생성되기 때문에 늘 실패 타이머에 대해 나에게 경고를, 그래서 내가 비록 전에 타이머를 만드는 방법에 대한 연결.

userslist = getIndividualUsersNextTimerAsDate(); 
    setTimout("timedCount()",1000); 
    timedCount() 
    { 
     foreach(user in userslist) 
     { 
     if(user.time <= now()) 
     { 
     if(user.socket) 
     { 
     user.socket.emit("poke"); 
     } 
     user.time = resetTimeForNextTimer(user); 
     } 
     } 
    } 
    socket.on("connect") 
    { 
     ... 
     userslist[x].socket = client; 
    } 

또는 여러 개의 타이머마다 "시간":

var userslist = GetUsersTimers(); 
    foreach(user in userslist) 
    { 
    user.Counter = setTimeout("runTime()",client.timer); 
    } 
runTime(client) 
{ 
    client.emit("poke"); 
    client.Counter.cancel(); 
    client.timer = resetToNextTimer(); 
    client.Counter = setTimeout("runTime()",client.timer); 
} 

또는 내가 누락 더 좋은 방법이 그래서 더 빨리 초마다 1 개 타이머를 만드는 것입니다?

답변

0

몇 일 동안 지속될 수있는 것처럼 들리지만 연결은 대개 그 기간 동안 지속되지 않습니다. 사용자가 서버에 다시 연결하고 항상 연결됩니까?

사용자가 항상 연결되어 있다고 가정하면 종료 시간을 데이터베이스에 저장합니다. 서버가 다운 된 경우 종료 시간을 복구하고 정상적으로 다시 시작할 수 있습니다. 새 타이머가 생기면 setTimeout을 사용하여 절전 모드로 전환하십시오. 다시 시작할 때 setTimeout을 다시 할 수 있습니다. 종료 시간과 현재 시간을 알 수 있습니다 (즉, 지속 시간을 얻음).

이렇게하면 "합리적인"개수의 타이머가 작동합니다. 수백만 개의 타이머를 사용한다면 실제로는 X 밀리 초/초/분마다 깨어나고 종료 시간 중 하나라도 경과했는지 확인한 후 종료 시간을 확인한 후 다시 sleep로 돌아가는 setInterval을 사용하는 것이 좋습니다. .