簡體   English   中英

nodejs計時器性能

[英]nodejs timers performance

我必須在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 );
 }

還是我想念的更好的方法?

聽起來您的某些計時器可能會持續數天,但連接通常無法維持那么長時間。 用戶是否將重新連接到服務器並始終保持連接狀態?

假設用戶始終處於連接狀態,那么我會將結束時間存儲在數據庫中。 萬一服務器出現故障,您可以恢復結束時間並正常重啟。 當您獲得新的計時器時,請使用setTimeout進入睡眠狀態。 重新啟動后,您可以重新執行setTimeout,因為您知道結束時間和當前時間(即獲得持續時間)。

這將工作“合理”數量的計時器。 如果您將要擁有數百萬個此類計時器,則實際上最好使用setInterval,它每隔X毫秒/秒/分鍾喚醒一次,檢查是否有任何結束時間經過,對這些結束時間采取行動,然后返回睡眠狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM