2012-05-23 79 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); 
} 

,但是這不會提醒我關於失敗的定時器(如果客戶端斷開連接),因爲計時器連接後才創建的,所以我雖然有關創建定時器,前連接。那麼,是不是更快地創建1個定時器每秒:

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); 
} 

還是有我就是缺少什麼更好的辦法?

回答

0

這聽起來像你的一些定時器可以持續幾天,但連接通常不會存活那麼久。用戶是否會重新連接到服務器並始終連接?

假設用戶總是連接,那麼我會將結束時間存儲在數據庫中。如果服務器出現故障,您可以恢復結束時間並正常重啓。當你得到一個新的計時器時,使用setTimeout進入睡眠狀態。重啓後,您可以重新執行setTimeout,因爲您知道結束時間和當前時間(即獲取持續時間)。

這將工作一個「合理」數量的定時器。如果你將擁有數百萬個這樣的定時器,那麼使用setInterval實際上會更好,它可以每X毫秒/秒/分鐘醒來,檢查是否有任何結束時間已經過去,對它們起作用,然後回到睡眠狀態。