作为一个游戏服务器,必然有很多定时器的使用,算是游戏服务器开发的基础模块,我们经常需要在我们预期的某个时间点执行某项特定的操作。比如每天M点开启某个活动,N小时后之后刷新排行榜等等。这些功能通常需要定时器控制,之前我们的服务器代码中每加一个延迟执行的功能就启动一个定时器,这样到最后往往代码特别臃肿,而且定时器时稀缺资源,过多的定时器必然导致效率问题,于是要想办法优化。
想要优化定时器就要看定时器一共有多少种:
1.只执行一次的定时器,比如60秒后执行操作A。
2.循环执行的定时器,比如每隔30分钟执行一次操作B。
3.每日/每周/每月特定时间点执行一次的操作C。(eg.每天下午6点执行操作C)
我们要做的就是,把一整套需要定时器的操作整合到一个定时器管理器Manager里面,然后每次有新的定时器要添加,调用Add接口加到Manager里面,Manager只会启动一个定时器,它会自动寻找最近需要执行的定时器然后到时间点后处理相关逻辑。这样我们每次增加定时器操作就是往管理器里面添加一个操作就行了,其他的管理器会替我们解决。
from common import Timer
from util import TimeUtil
from base.Defines import *
class TimerObj(object):
"""封装一个定时器对象"""
def __init__(self, start_time, interval, callback):
"""
:param start_time:定时器开始时间
:param interval:定时器间隔,如果只执行一次,填0
:param callback:触发定时器时执行的函数
:return:
"""
super(TimerObj, self).__init__()
self.start = start_time
self.interval = interval
self.callback = callback
def getEndTime(self):
if self.interval <= 0:
return self.start
return None
def getNextTime(self):
now_time = int(TimeUtil.now_time())
if now_time < self.start:
return self.start
else:
if self.getEndTime() is not None:
return None
num = 0
while self.start + n