服务器定时器的管理优化

本文介绍了游戏服务器中定时器的优化方案,通过创建一个定时器管理器集中处理所有定时任务,减少资源消耗。详细讨论了不同类型的定时器,并展示了如何实现和改进定时器管理器,包括使用列表存储定时器对象、最小堆优化、定时器启动和停止的优化等。此外,文章还提出了进一步优化的建议,如隐藏内部实现细节,提供更简洁的接口给用户。
摘要由CSDN通过智能技术生成
作为一个游戏服务器,必然有很多定时器的使用,算是游戏服务器开发的基础模块,我们经常需要在我们预期的某个时间点执行某项特定的操作。比如每天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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值