【问题标题】:nodejs timers performancenodejs计时器性能
【发布时间】:2012-09-08 03:09:53
【问题描述】:

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

或者有什么更好的方法让我想念?

【问题讨论】:

    标签: javascript performance node.js timer


    【解决方案1】:

    听起来您的某些计时器可以持续数天,但连接通常不会持续那么久。用户是否会重新连接到服务器并始终保持连接?

    假设用户始终处于连接状态,那么我会将结束时间存储在数据库中。如果服务器出现故障,您可以恢复结束时间并正常重新启动。当你得到一个新的计时器时,使用 setTimeout 去睡觉。重启时,您可以重新执行 setTimeout,因为您知道结束时间和当前时间(即获取持续时间)。

    这将工作“合理”数量的计时器。如果您将拥有数百万个这样的计时器,那么实际上最好使用 setInterval ,它每 X 毫秒/秒/分钟唤醒一次,检查是否有任何结束时间已经过去,对这些时间采取行动,然后重新进入睡眠状态.

    【讨论】:

      猜你喜欢
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 2018-01-03
      • 2020-02-28
      • 1970-01-01
      相关资源
      最近更新 更多