定时器的处理方法及装置的制作方法

文档序号:6438494阅读:243来源:国知局
专利名称:定时器的处理方法及装置的制作方法
技术领域
本申请涉及数据处理领域,具体而言,涉及一种定时器的处理方法及装置。
背景技术
随着互联网技术的发展,海量元素定时器得到越来越多的应用。这里,首先描述一下关于海量元素定时器的几个基本概念:1)定时器是指在指定的时间点或者指定的时间范围内触发预先设定好的事件的硬件或者软件的具体实现;定时器事件是指,需要在某个时间点或者时间范围内,做某件事情的一个数据结构实体;海量元素是指大量的需要触发的事件,例如百万以上的级别;海量元素定时器是指,在指定的时间点或者指定的时间范围内触发预先设定好的海量元素的硬件或者软件的具体实现。在现有技术中,从操作系统底层到应用层,有很多种方法实现海量元素定时器。但是,这些方法只适合于数据量不大,时间范围比较连续的情况,对于海量元素且时间分布离散的定时器,现有技术中缺少比较好的实现方法。例如,在现有技术中存在无序链表、有序链表和时间轮等几种方案,以下分别介绍。I)无序链表方案:按照创建顺序,把事件元素用链表连接起来,不停遍历链表,查找到达发生时间点的事件元素并处理。在该种实现方式中,由于在链表中事件是无序排列,所以要判断哪些事件到了触发点,必须要遍历所有元素,假设当前有500万个事件元素在链表中,从定时器事件的触发时间到达至执行该定时器事件的时间要求不超过I秒(即,定时器事件精确度要求为I秒),那么遍历将会导致CPU处理负荷飙升,大幅增加系统负载。2)有序链表方案:按照事件的发生时间顺序,把事件元素用一个有序的链表连接起来,查找到达发生时间点的事件元素并处理。该方案是对无序链表实现的改进。然而,该种实现方式虽然对链表做到了有序排列,降低了查找开销,但是对于插入元素却带来了额外的开销,因为每次插入需要先查找在有序链表中的插入点,随着元素的增多这个开销会增大,影响处理效率。3)时间轮方案:把时间按照一定的间隔划分,并预先为每个时间段划分好存储空间,把事件元素按照发生时间分别存储到对应时间段的存储空间,当到达某个时间轮范围时,取出这一个轮所包含的所有事件元素。该时间轮的实现方式对于时间范围分布比较均匀的事件元素比较合适,但对于时间分布很离散的事件元素则不适合,因为时间轮的实现,需要分配连续的空间,而如果是离散的时间分布,则此种方式会大量浪费内存资源。因此,针对相关技术中定时器的处理方式系统开销比较大的问题,目前尚未提出有效的解决方案。

发明内容
针对现有技术中定时器的处理方式系统开销比较大的问题,本申请的主要目的在于提供一种定时器的处理方法及装置,以解决上述问题。为了实现上述目的,根据本申请的一个方面,提供一种定时器的处理方法,其包括:将定时器事件的触发时间划分成多个时间段,其中,每一个所述时间段对应于一个哈希值;将触发时间在同一个时间段上的定时器事件插入到同一个链表中;以及将各个所述链表中的定时器事件映射到哈希表中,其中,每一个定时器事件在哈希表中对应地存储有一个哈希值以及该定时器事件所在的链表的标识。优选地,所述将各个所述链表中的定时器事件映射到哈希表中之后,所述定时器的处理方法还包括:获取当前时间段所对应的当前哈希值;在所述哈希表中查找与所述当前哈希值对应的链表的标识;执行查找到的链表的标识指示的链表中的定时器事件。优选地,所述执行查找到的链表的标识指示的链表中的定时器事件的步骤包括:创建任务队列;将查找到的链表中的定时器事件加入所述任务队列中;执行所述任务队列中的定时器事件。优选地,所述将查找到的链表中的定时器事件加入所述任务队列中的步骤包括:创建调度线程;所述调度线程判断是否存在所述查找到的链表中的定时器事件;在判断出存在所述查找到的链表中的定时器事件时,所述唤醒的调度线程将查找到的链表中的定时器事件加入所述任务队列中。优选地,所述执行任务队列中的定时器事件的步骤包括:任务线程执行任务队列中的定时器事件。优选地,所述将触发时间在同一个时间段上的定时器事件插入到同一个链表中的步骤具体包括:判断待处理的定时器事件的触发时间所处的时间段;获取所述触发时间所处的时间段对应的哈希值;查找与所获取到的哈希值对应的链表;将所述待处理的定时器事件插入到所查找到的链表中。优选地,所述查找与所获取到的哈希值对应的链表的步骤包括:在查找不到与所获取到的哈希值对应的链表时,创建与所获取到的哈希值对应的链表,并将所创建的链表作为所述查找到的链表。优选地,所述将触发时间在同一个时间段上的定时器事件插入到同一个链表中的步骤包括:按照触发时间的先后顺序在同一个时间段上将触发时间在该同一个时间段上的定时器事件插入到同一个链表中。为了实现上述目的,根据本申请的另一方面,还提供一种定时器的处理装置,其包括:划分单元,用于将定时器事件的触发时间划分成多个时间段,其中,每一个所述时间段对应于一个哈希值;插入单元,用于将触发时间在同一个时间段上的定时器事件插入到同一个链表中;映射单元,用于将各个所述链表中的定时器事件映射到哈希表中,其中,每一个定时器事件在哈希表中对应地存储有一个哈希值以及该定时器事件所在的链表的标识。优选地,所述定时器的处理装置还包括:获取单元,用于在将各个所述链表中的定时器事件映射到哈希表中之后,获取当前时间段所对应的当前哈希值;查找单元,用于在所述哈希表中查找与所述当前哈希值对应的链表的标识;执行单元,用于执行查找到的链表的标识指示的链表中的定时器事件。在本申请中,由于将各个所述链表中的定时器事件映射到哈希表中,其中,每一个定时器事件在哈希表中对应地存储有一个哈希值以及该定时器事件所在的链表的标识,因此,在查找定时器事件时,对于属于同一个哈希值的定时器事件,可以仅执行一次查找操作即得到对应于哈希值的链表,并得到该链表下的所有定时器事件,从而大大降低了比较操作执行的次数,解决了现有技术中定时器的处理方式系统开销比较大的问题,实现了减小处理定时器事件的系统开销的技术效果。


构成本申请的一部分的附图用来提供对本申请的进一步理解,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:图1是根据本申请实施例的定时器的处理方法的一种优选地流程图;图2是根据本申请实施例的对新增定时器事件的定时器的处理方法的一种优选地流程图;图3是根据本申请实施例的创建哈希表的一种优选地流程示意图;图4是根据本申请实施例的创建由定时器事件组成的任务队列的一种优选地流程不意图;图5是根据本申请实施例的任务线程对任务队列进行调度的一种优选地流程图;图6是根据本申请实施例的执行定时器事件的一种优选地流程图;图7是根据本申请实施例的定时器的处理装置的一种优选地示意图;图8是根据本申请实施例的定时器的处理装置另一种优选地示意图;图9是根据本申请实施例的定时器的处理装置的又一种优选地示意图。
具体实施例方式需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。实施例1图1是根据本申请实施例的定时器的处理方法的流程图。如图1所示,该定时器的处理方法包括:步骤S102,将定时器事件的触发时间划分成多个时间段,其中,每一个所述时间段
对应于一个哈希值。优选地,在将定时器事件的触发时间换算为哈希值时,还可以根据精确度的要求进行换算,如果定时器精确度要求为I秒,则定时器事件的触发时间采用32位的二进制数据来表示;如果定时器精确度要求为0.001秒,则定时器事件的触发时间采用64位的二进制数据来表示。步骤S104,将触发时间在同一个时间段上的定时器事件插入到同一个链表中。优选地,按照各个定时器事件的触发时间的时间顺序,将属于同一个哈希值的定时器事件插入到同一个链表中,即,实现了链表中各个定时器事件的有序存储。步骤S106,将各个所述链表中的定时器事件映射到哈希表中,其中,每一个定时器事件在哈希表中对应地存储有一个哈希值以及该定时器事件所在的链表的标识。基于上述步骤得到的链表和哈希表,由于将触发时间划分为多个时间段,并且将属于同一时间段的定时器事件换算为同一个哈希值,以及将同一个哈希值的定时器事件插入到同一个链表中,因而,在查找定时器事件时,只需要根据待查询的时间段信息,根据哈希值换算规则,得到哈希值,根据该哈希值就可以找到待查询的时间段内的定时器事件,仅执行一次查找操作,就可以得到对应于哈希值的链表,从而得到该链表下的所有定时器事件,即哈希值相同的定时器事件,可以提高查找的效率,进而能够减小系统开销。优选地,为了将各个链表映射到哈希表中,可以首先创建一个哈希表;在创建哈希表后,将步骤S104中得到的插入属于同一个哈希值的定时器事件的各个链表映射到创建的哈希表中。具体地,如图3所示,仓丨」建的哈希表的格式为hash_map〈time_t, list〈CTimer*>>,其中,CTimer表示定时器事件的数据结构,list〈CTimer*>表示由定时器事件所构成的链表,<time_t, list〈CTimer*>>表示按照触发时间(time_t)对应的哈希值将各个链表映射到哈希表中。基于上述实施例1提供的这种处理方式,结合了离散和线性两种处理方式,即,结合了由哈希值构成哈希表的离散处理方式以及由链表线性存储同一哈希值的定时器事件的线性处理方式,在插入定时器事件时,只需要经过哈希计算,得到哈希值,并在找到对应哈希值的链表后,将该定时器事件插入该链表中即可,这不但避免有序链表方案在插入定时器事件时需要查找触发时间在整个链表中的位置而导致的查找开销大的问题,而且避免了时间轮方案在需要预先分配存储空间而导致存储空间浪费的问题,其不但具有存储简单、开销小的优点,而且可以有效地利用存储空间。实施例2需要说明的是,该实施例中的定时器的处理方法既可以包括对已有定时器事件的处理方法,也可以包括对新增定时器事件的处理方法。图2即为根据本申请实施例的对新增定时器事件的定时器的处理方法的流程图。假定新增多个定时器事件,此处仅以新增第一定时器事件为例进行描述,其中,该第一定时器事件可以是多个新增定时器事件中的任意一个定时器事件。具体包括如下步骤:步骤S202,将第一定时器事件的触发时间换算为第一哈希值。步骤S204,查找第一哈希值对应的链表。步骤S206,判断是否能够查找到与第一哈希值对应的链表,若判断结果为是,则执行步骤S210,否则,执行步骤S208。步骤S208,创建对应于第一哈希值的链表。通过该步骤S208,由于通过按照哈希值创建相应的链表,能够使得每个创建的链表分别对应于同一个哈希值,从而在出现同一哈希值对应的定时器事件时,可以直接将定时器事件插入到所创建的链表中。步骤S210,将第一定时器事件插入到相应的链表中。优选地,在该步骤S210中,每间隔一段时间,例如第一预设时间,判断一次是否有新的定时器事件产生,若确定有新的定时器事件产生时,执行一次插入,此时步骤S210还包括以下步骤S210-1至步骤S210-2:步骤S210-1,判断计时的时间长度是否达到第一预设时间长度,其中,该第一预设时间长度可以是根据实际需要设定的任意时间长度,在确定一个时间点之后,从该时间点开始计时,并判断计时的时间长度是否达到第一预设时间长度,其中,在第一次执行插入时,计时的开始时间点可以是任意设定的时间点,在后续执行插入时,计时的开始时间点为执行上一次插入结束时的时间点;以及
步骤S210-2,在计时的时间长度达到第一预设时间长度时,将该计时的时间长度内新增的、需要插入到链表中的定时器事件插入到对应的链表中,其中,将触发时间在同一个时间段上的定时器事件插入到同一个链表中。根据上述的插入方式,可以每隔预定的时间对需要插入链表的定时器事件执行批量地插入操作,而不是在一出现需要插入链表的定时器事件就执行插入操作,这样可以进一步地减小系统开销。由于在新增一个定时器事件时,直接查找该定时器事件对应的链表,然后将定时器事件插入到对应的链表中,使得在每增加一个定时器事件时,就能够将该定时器事件存储到预设的位置,实现了定时器事件的有序存储的技术效果。实施例3基于上述实施例1或2所得到的哈希表,通过调度可以执行链表中的各个定时器事件。本实施例提供了一种优选地定时器事件的调度方式。以下对本申请实施例的调度过程进行描述,该调度过程包括以下步骤:步骤SI,将各个所述链表中的定时器事件映射到哈希表中之后,获取当前时间段所对应的当前哈希值;步骤S2,在所述哈希表中查找与所述当前哈希值对应的链表的标识;步骤S3,执行查找到的链表的标识指示的链表中的定时器事件。对于如何执行查找到的链表的标识指示的链表中的定时器事件,本申请提供了几种优选的实现方式,具体包括如下步骤:I)步骤S3-1,创建任务队列;任务队列用于放置当前需要执行的定时器事件。具体地,如图4所示,该图示出了创建一个由定时器事件组成的任务队列的过程,首先初始化程序,然后创建一个由定时器事件CTimer*所构成的任务队列queue。在创建任务队列之后,任务线程可以从任务队列中获取定时器事件。2)步骤S3_2(调度步骤):用于将预定的时间段换算成至少一个哈希值,根据该哈希值,在哈希表中查找对应的链表,将查找到的链表中的定时器事件加入任务队列中,执行任务队列中的定时器事件。上述预定的时间段可以为需要调度的定时器事件的触发时间所对应的时间段,也可以是根据实际需要设置的任意长度的时间段。在本实施例中,首先根据定时器事件的触发时间确定需要调度的定时器事件,然后再对定时器事件进行调度。具体地,该步骤S3-2中的调度步骤可以包括步骤S3-2-1至步骤S3_2_3:步骤S3-2-1,创建调度线程;步骤S3-2-2,调度线程查找哈希表中的定时器事件;在该步骤S3-2-2中,基于上述实施例所得到的哈希表,调度线程以链表为单位查找哈希表中哈希值对应的定时器事件。具体地,由于在哈希表中,将触发时间划分为多个时间段,并且将属于同一时间段的定时器事件换算为同一个哈希值,以及将同一个哈希值的定时器事件插入到同一个链表中,因而,在调度线程查找定时器事件时,只需要根据待查询的时间段信息,根据哈希值换算规则,得到哈希值,根据该哈希值就可以找到待查询的时间段内的定时器事件,仅执行一次查找操作,就可以得到对应于哈希值的链表,从而得到该链表下的所有定时器事件,即以链表为单位查找哈希表中哈希值对应的定时器事件,提高了查找的效率,进而减小了系统开销。为了减少系统开销,每隔预定时间唤醒一次所述调度线程,例如,每间隔第二预设时间段唤醒一次,将当前查找到的定时器事件加入到任务队列中,在执行完操作后进入休眠状态。具体地,本优选的实施例还提供了执行任务队列中的定时器事件的步骤S3-2-2,其中,该步骤S3-2-2还包括步骤S3-2-2-1和步骤S3-2-2-2:步骤S3-2-2-1,调度线程每间隔第二预设时间段唤醒一次;步骤S3-2-2-2,取出第二预设时间段前后时间值对应的哈希值范围,以查找哈希表中的定时器事件。在查找到哈希表中的定时器事件之后,即可通过调度将所查找到的定时器事件加入到任务队列中,以便通过任务线程来执行任务队列中的定时器事件。

其中,该第二预设时间段可以是根据实际需要任意设定的时间段,通过使得调度线程每间隔第二预设时间段唤醒一次,可以使得调度线程不必一直处于唤醒状态,而是每间隔第二预设时间段之后,调度线程唤醒一次,相比于调度线程一直处于唤醒状态,或者不间断地执行调度,减小了系统开销。例如,如图5所示,调度线程可以每间隔0.1秒唤醒一次,优选地,该调度线程的时间精确度可以是比定时器事件要求的精确度高至少一个数量级,这样可以使得整个执行定制器的过程满足定时器事件所需的精确度的要求,实现更精确地查找。比如定时器事件要求的时间精确度为I秒,那么调度线程可以每隔0.1秒唤醒一次。以下对查找哈希表中的定时器事件的过程进行描述:调度线程每间隔一段时间唤醒一次,以查找哈希表中的定时器事件,在查找完毕后重新进入休眠状态,具体地,调度线程(比如间隔0.1秒)自唤醒之后判断任务队列中是否有定时器事件,在判断结果为是时,执行步骤a,否则,执行步骤b。步骤a,调度线程从上一次唤醒的时间值对应的哈希值last_KEY到当前时间值对应的哈希值now_KEY的范围内,查找哈希表中KEY对应的定时器事件链表。步骤b,用当前时间值替换上一次时间值,从而更新上一次唤醒的时间值,以便在下次执行查找时,从最近的上一次唤醒的时间值对应的哈希值last_KEY到当前时间值对应的哈希值now_KEY的范围内,查找哈希表中KEY对应的定时器事件链表。步骤S3-2-3,调度线程在查找到哈希表中存在哈希值对应的定时器事件时,可以将查找到的链表中的定时器事件加入到任务队列中以完成对定时器事件的调度。如前述实施例所述,在哈希表中,定时器事件的存储格式为hash_map〈time_t,list<CTimer* 0在该步骤S3-2-3中,在查找到哈希表中存在哈希值对应的定时器事件时,可以从哈希表中得到定时器事件链表list〈CTimer*>。在时间已知的情况下,通过步骤S3-2-1至步骤S3-2-3,就可以获取与该时间相对应的定时器事件的链表,然后将获取的链表中的定时器事件放入任务队列中并完成对定时器事件的调度。在该实施例中,通过步骤S3-2-2可以看出,本申请实施例所创建的调度线程是以链表为单位查找哈希表中哈希值对应的定时器事件,在查找到一个链表时,就可以查找到该链下的对应同一哈希值的所有定时器事件,因而,通过采用本申请实施例所提供的调度方法,可以极大地提高调度线程的查找效率。实施例4在完成上述步骤S3-2中的调度步骤之后,或者,在执行完步骤上述S3-2-2中将查找到的链表中的定时器事件加入到任务队列中之后,还可以通过任务线程执行任务队列中的定时器事件。因而,本申请实施例所提供的定时器的处理方法还可以包括定时器事件的执行过程。需要说明的是,基于上述本申请实施例所提供的定时器事件的存储方式,以及定时器事件的调度方法,本申请实施例所提供的定时器事件的执行过程可以是采用常规的方式来执行,也可以是采用以下本申请实施例所提供的优选方式来执行。图6示出了任务线程从任务队列中获取任务以执行定时器事件的方法。如图6所示,上述执行定时器事件的过程可以包括以下步骤:步骤S602,创建任务线程;步骤S604,在创建一定数量的任务线程之后,任务线程等待从任务队列中获取定时器事件。为了减少系统开销,优选地,任务线程每间隔一段时间唤醒一次,执行任务队列中的定时器事件,并且在执行完任务队列中的定时器事件后,重新进入休眠状态。或者,在执行完步骤S3-2-2中将查找到的链表中的定时器事件置于任务队列中之后,唤醒任务线程以执行任务队列中的定时器事件,以及在执行完任务队列中的定时器事件后,重新进入休眠状态。步骤S606,任务线程判断任务队列中是否有任务;在判断结果为是时,执行步骤S608,在判断结果为否时,执行步骤S604,等待下一次唤醒,并继续判断任务队列中是否有任务。步骤S608,任务线程从任务队列中获取定时器事件。步骤S610,执行定时器事件。在本申请中,由于把定时器事件按照触发时间,根据精确度的要求换算成一个哈希值,将其映射到一个支持离散存储的容器中(哈希表)。以及用离散存储(哈希表)和线性存储(链表)相结合的方式来存储和管理定时器事件。即将同一个时间段内触发的定时器事件的触发时间换算为一个哈希值,用同一个链表一个时间段内触发的定时器事件,并将该链表映射到哈希表中。更进一步地,可以用调度线程和任务线程分离的方式分别完成触发和运行定时器事件。调度线程可以从哈希表中获取事件元素链表,并将每个元素放置在任务队列中。任务线程负责从任务队列中获取元素并处理。从而在获取到时间范围的情况下,可以直接获取时间范围所对应的定时器事件的链表以获取到链表中的所有定时器事件,这有效降低了对海量元素定时器处理的系统开销。需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。实施例5
本申请实施例还提供了一种定时器的处理装置,该定时器的处理装置可以用于实现上述本申请实施例提供的定时器的处理方法。图7是根据本申请实施例定时器的处理装置的一种优选示意图。如图7所示,该定时器的处理装置包括:I)划分单元702,用于将定时器事件的触发时间划分成多个时间段,其中,每一个所述时间段对应于一个哈希值。优选地,在所述划分单元702将定时器事件的触发时间换算为哈希值时,还可以根据精确度的要求进行换算,如果定时器的精确度要求为I秒,则定时器事件的触发时间采用32位的二进制数据来表示;如果定时器精确度要求为0.001秒,则定时器事件的触发时间采用64位的二进制数据来表示。2)插入单元704,用于将触发时间在同一个时间段上的定时器事件插入到同一个链表中。优选地,所述插入单元704按照各个定时器事件的触发时间的时间顺序,将属于同一个哈希值的定时器事件插入到同一个链表中,即,实现了链表中各个定时器事件的有
序存储。3)映射单元706,用于将各个所述链表中的定时器事件映射到哈希表中,其中,每一个定时器事件在哈希表中对应地存储有一个哈希值以及该定时器事件所在的链表的标识。优选地,为了将各个链表映射到哈希表中,可以首先创建一个哈希表;在创建哈希表后,映射单元706将插入单元704得到的插入属于同一个哈希值的定时器事件的各个链表映射到创建的哈希表中。在上述定时器的处理装置中,由于所述划分单元702将触发时间划分为多个时间段,并且将属于同一时间段的定时器事件换算为同一个哈希值,以及所述插入单元704将同一个哈希值的定时器事件插入到同一个链表中,因而,在查找定时器事件时,只需要根据待查询的时间段信息,根据哈希值换算规则,得到哈希值,根据该哈希值就可以找到待查询的时间段内的定时器事件,仅执行一次查找操作,就可以得到对应于哈希值的链表,从而得到该链表下的所有定时器事件,即哈希值相同的定时器事件,可以提高查找的效率,进而能够减小系统开销。图8是根据本申请实施例的定时器的处理装置另一种的优选示意图。如图8所示,上述定时器的处理装置还可以包括:I)获取单元802,用于在将各个所述链表中的定时器事件映射到哈希表中之后,获取当前时间段所对应的当前哈希值。2)查找单元804,用于在所述哈希表中查找与所述当前哈希值对应的链表的标识。3)执行单元806,用于执行查找到的链表的标识指示的链表中的定时器事件。对于如何执行查找到的链表的标识指示的链表中的定时器事件,本申请提供了几种优选的实现方式,优选地,所述执行单元806包括:I)创建模块8061,用于创建任务队列,其中,任务队列用于放置当前需要执行的定时器事件。
2)调度模块8062,用于将预定的时间段换算成至少一个哈希值,根据该哈希值,在哈希表中查找对应的链表;将查找到的链表中的定时器事件加入任务队列中,以便由任务线程来执行任务队列中的定时器事件。优选地,所述调度模块8062通过以下步骤将查找到的链表中的定时器事件加入任务队列中:创建调度线程;每隔预定时间唤醒所述调度线程;所唤醒的调度线程判断是否存在所述查找到的链表中的定时器事件以及在判断出存在所述查找到的链表中的定时器事件时,所述唤醒的调度线程将查找到的链表中的定时器事件加入所述任务队列中。上述实施例中,用调度线程和任务线程分离的方式分别完成触发和运行定时器事件。调度线程可以从哈希表中获取事件元素链表,并将每个元素放置在任务队列中。任务线程负责从任务队列中获取元素并处理。从而在获取到时间范围的情况下,可以直接获取时间范围所对应的定时器事件的链表以获取到链表中的所有定时器事件,这有效降低了对海量元素定时器处理的系统开销。优选地,图9是根据本申请实施例的定时器的处理装置又一种优选地示意图。如图9所示,所述插入单元704还包括:I)判断模块7041,用于在将触发时间在同一个时间段上的定时器事件插入到同一个链表中的过程中,判断待处理的定时器事件的触发时间所处的时间段;2)获取模块7042,用于获取所处的时间段对应的哈希值;3)查找模块7043,用于查找与所获取到的哈希值对应的链表;4)插入模块7044,用于将所述待处理的定时器事件插入到所查找到的链表中。优选地,插入单元704还包括:5)创建模块7045,用于在所述查找模块查找不到与所获取到的哈希值对应的链表时,创建与所获取到的哈希值对应的链表,并将所创建的链表作为所述查找到的链表。优选地,所述插入单元704还用于按照触发时间的先后顺序在同一个时间段上将触发时间在该同一个时间段上的定时器事件插入到同一个链表中。在上述实施例中,由于将触发时间划分为多个时间段,并且将属于同一时间段的定时器事件换算为同一个哈希值,将同一个哈希值的定时器事件插入到同一个链表中,因而,在查找定时器事件时,只需要根据待查询的时间段信息,根据哈希值换算规则,得到哈希值,根据该哈希值就可以找到待查询的时间段内的定时器事件,仅执行一次查找操作,就可以得到对应于哈希值的链表,从而得到该链表下的所有定时器事件,即哈希值相同的定时器事件。本申请实施例提供的这种处理方式,结合了离散和线性两种处理方式,即结合了由哈希值构成哈希表离散处理方式以及由链表线性存储同一哈希值的定时器事件,在插入定时器事件时,只需要经过哈希计算,得到哈希值,并在找到对应哈希值的链表后,将该定时器事件插入该链表中即可,这不但避免有序链表方案插入定时器事件时需要查找到对应的具体插入链表的位置而导致存在开销大的问题,而且避免了时间轮方案需要预先分配存储空间而导致存储空间浪费的问题,具有存储简单、开销小的优点,并且可以有效地利用存储空间。通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。本申请可用于众多通用或专用的计算系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。从以上的描述中,可以看出,本申请实现了降低对海量元素定时器处理的系统开销以及节约内存空间的效果。显然,本领域的技术人员应该明白,上述的本申请的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本申请不限制于任何特定的硬件和软件结合。以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
权利要求
1.一种定时器的处理方法,其特征在于,包括: 将定时器事件的触发时间划分成多个时间段,其中,每一个所述时间段对应于一个哈希值; 将所述触发时间在同一个时间段上的定时器事件插入到同一个链表中;以及将各个所述链表中的定时器事件映射到哈希表中,其中,每一个所述定时器事件在哈希表中对应地存储有一个哈希值以及该定时器事件所在的链表的标识。
2.根据权利要求1所述的方法,其特征在于,所述将各个所述链表中的定时器事件映射到哈希表中之后,还包括: 获取当前时间段所对应的当前哈希值; 在所述哈希表中查找与所述当前哈希值对应的链表的标识; 执行查找到的链表的标识指示的链表中的定时器事件。
3.根据权利要求2所述的方法,其特征在于,所述执行查找到的链表的标识指示的链表中的定时器事件的步骤包括: 创建任务队列; 将查找到的链表中的定时器事件加入所述任务队列中; 执行所述任务队列中的定时器事件。
4.根据权利要求3所述的方法,其特征在于,所述将查找到的链表中的定时器事件加入所述任务队列中的步骤包括: 创建调度线程; 所述调度线程判断是否存在所述查找到的链表中的定时器事件;以及在判断出存在所述查找到的链表中的定时器事件时,所述唤醒的调度线程将查找到的链表中的定时器事件加入所述任务队列中。
5.根据权利要求4所述的方法,其特征在于,所述执行任务队列中的定时器事件的步骤包括: 任务线程执行任务队列中的定时器事件。
6.根据权利要求1所述的方法,其特征在于,所述将触发时间在同一个时间段上的定时器事件插入到同一个链表中的步骤具体包括: 判断待处理的定时器事件的触发时间所处的时间段; 获取所述触发时间所处的时间段对应的哈希值; 查找与所获取到的哈希值对应的链表; 将所述待处理的定时器事件插入到所查找到的链表中。
7.根据权利要求6所述的方法,其特征在于,所述查找与所获取到的哈希值对应的链表的步骤包括: 在查找不到与所获取到的哈希值对应的链表时,创建与所获取到的哈希值对应的链表,并将所创建的链表作为所述查找到的链表。
8.根据权利要求1所述的方法,其特征在于,所述将触发时间在同一个时间段上的定时器事件插入到同一个链表中的步骤包括: 按照触发时间的先后顺序在同一个时间段上将触发时间在该同一个时间段上的定时器事件插入到同一个链表中。
9.一种定时器的处理装置,其特征在于,包括: 划分单元,用于将定时器事件的触发时间划分成多个时间段,其中,每一个所述时间段对应于一个哈希值; 插入单兀,用于将触发时间在同一个时间段上的定时器事件插入到同一个链表中; 映射单元,用于将各个所述链表中的定时器事件映射到哈希表中,其中,每一个定时器事件在哈希表中对应地存储有一个哈希值以及该定时器事件所在的链表的标识。
10.根据权利要求9所述的装置,其特征在于,还包括: 获取单元,用于在将各个所述链表中的定时器事件映射到哈希表中之后,获取当前时间段所对应的当前哈希值; 查找单元,用于在所述哈希表中查找与所述当前哈希值对应的链表的标识;执行单元,用于执行查找到的链表的标识 指示的链表中的定时器事件。
全文摘要
本申请公开了一种定时器的处理方法及装置,其中,该定时器的处理方法包括将定时器事件的触发时间划分成多个时间段,其中,每一个所述时间段对应于一个哈希值;将触发时间在同一个时间段上的定时器事件插入到同一个链表中;以及将各个所述链表中的定时器事件映射到哈希表中,其中,每一个定时器事件在哈希表中对应地存储有一个哈希值以及该定时器事件所在的链表的标识。本申请解决了现有技术中定时器的处理方式系统开销比较大的问题,实现了减小处理定时器事件的系统开销的技术效果。
文档编号G06F17/30GK103106222SQ20111036231
公开日2013年5月15日 申请日期2011年11月15日 优先权日2011年11月15日
发明者王冠 申请人:阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1