[英]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.