一种保证时间连续性的线程池设计方法技术

技术编号:6088697 阅读:230 留言:0更新日期:2012-04-11 18:40
本发明专利技术涉及一种保证时间连续性的线程池设计方法,所述线程池需要维护一个任务标识到线程ID的Hash映射表,用来对任务的分配进行管理;线程参数增加一个属性参数:负载(nLoad),用以标识各线程所分配的任务总量;所有线程不再共享同一任务队列,而是为线程池中的每一个线程配置一个与之相对应的任务队列,各线程从相应的任务队列中查找新的任务;单独有一监视线程。本发明专利技术具有下列优点:1、本发明专利技术利用新增的映射表功能,可以保证每一个任务的数据输入输出时的时间连续性完全一致;2、通过定时启动的监视线程可以保证各线程上的负载总能趋于一致,以达到最佳的并发性能。

A thread pool design method for ensuring time continuity

The invention relates to a method of thread pool to ensure the continuity of the thread pool needs to maintain a task ID to thread ID Hash table, to manage the tasks assigned to; thread parameters add an attribute parameter: load (nLoad), with the total amount of tasks assigned to each thread identifier no longer; all threads share the same task queue, but in the thread pool each thread a configuration corresponding to the task queue, the thread from the corresponding task queue for new tasks; an individual monitoring thread. The invention has the following advantages: mapping table function 1, the invention uses a new, can guarantee the data input and output of each task when the time continuity of exactly the same; 2, by monitoring the timing start thread can ensure the thread load always tends to be consistent, in order to achieve the best performance of the concurrent.

【技术实现步骤摘要】

本专利技术涉及一种线程池的设计方法,尤其涉及到保证时间连续性的线程池设计方法
技术介绍
线程池是一种多线程的处理形式。线程池会预先创建若干线程以执行应用程序的 任务,这些线程通常是以队列的形式组织的。一般,线程池需要执行的任务数量要大于线程 池中线程的数量。当某个线程完成了一个任务后,会向任务队列中请求新的任务来执行,直 到任务队列中的任务全部完成。之后线程池中的线程就会被挂起或休眠直到有新的任务到 达。传统的线程池对于执行的任务都会有优先级的区别,对于同一优先级的任务是完 全平等对待的。但完全的平等并不适用于所有的应用场景。例如在实时数据库中,对于所 有的数据都有时间连续性的要求,但由于所有任务在线程池中并行执行,可能后到达的任 务先于之前的任务完成,从而使得线程池输出的数据与输入的数据在时间连续性上发生颠 倒。
技术实现思路
本专利技术所要解决的技术问题是提供一种在实时数据库中处理数据所用线程池的 设计方法。该方法在提供高效的数据处理能力的同时,还可以保证线程池中各线程所处理 数据的时间连续性以及各线程的负载均衡。为解决上述技术问题,本专利技术所述线程池需要维护一个任务标识到线程ID的 Hash映射表,用来对任务的分配进行管理;线程参数增加一个属性参数负载(nLoad),用 以标识各线程所分配的任务总量,该参数以一段时间内该任务到达线程池的频率(nFreq) 进行量化,其中时间段(nPeriod)的长度可以根据应用场景进行设置(单位为分钟),量化 公式如下权利要求1. ,其特征在于,所述线程池需要维护一个任 务标识到线程ID的Hash映射表,用来对任务的分配进行管理;线程参数增加一个属性参 数负载(nLoad),用以标识各线程所分配的任务总量,该参数以一段时间内该任务到达线 程池的频率(nFreq)进行量化,其中时间段(nPeriod)的长度可以根据应用场景进行设置 (单位为分钟),量化公式如下如果计算得到的nLoad结果为0,则记为1 ;所有线程不再共享同一任务队列,而是为线 程池中的每一个线程配置一个与之相对应的任务队列,各线程从相应的任务队列中查找新 的任务;单独有一监视线程,平时处于休眠状态,会定时启动监测各线程的负载情况,判定 的标准为线程的负载参数。2.根据权利要求1所述的,其特征在于,所述 步骤如下步骤一,初始化,线程池按设置创建N个线程,初始化任务标识到线程ID的Hash映射 表,初始化每个线程的任务队列,线程中的负载属性LThread初始化为0 ;步骤二,任务的添加,首先根据负载计算公式算出新添加任务的负载值LTask;使用顺 序查找法找出线程池中负载最轻的线程;将该任务分配给此线程,同时更新任务标识到线 程ID的Hash映射表,并将此任务的负载值LTask加到对应线程的原负载值LThread上,即 LThreadiff= LThread 丨日+Ltask ;步骤三,任务的删除,首先将该任务的负载值从对应线程的负载值上删除,然后更新任 务标识到线程ID的Hash映射表,将此任务的映射关系从映射表中删除;步骤四,任务的更新,当任务的频率发生变化,需要对其对应的线程负载进行更新,采 用先删除该任务再添加该任务的方式完成;步骤五,线程池的负载均衡,第二步中任务的添加是按照保证各线程负载趋于一致的 标准进行的。但当不断出现任务的删除时,各线程的负载情况就会出现不一致,其中最坏的 情况是只剩下某一线程有任务,而其他线程全部休眠,直接导致并发性能下降。因此需要监 视线程定时扫描线程池中各线程的负载情况,判断的依据采用方差的形式其中vLoad表示负载的方差值,N表示线程的个数,Loadi (i = 1,2,3…N)表示各线程 的负载值,而mLoad表示所有负载值的平均值,如下所示Loadi + Load2 4---4- Loadn当监视线程计算所得的负载方差超过LoadMax (默认为100,可以设为更小),则要进行 负载均衡的操作,将负载偏离平局值较大的线程上的任务重新分配到负载较小的线程上;步骤六,任务的执行,当某一任务到达,首先根据其任务标识从映射表中获取处理该任 务的线程ID,然后将该任务投递到此线程对应的任务队列中即可。各个线程从各自的任务 队列中获取新的任务来执行。3.根据权利要求2所述的,其特征在于,所述 方法对于到达线程池的任务,首先由任务分发模块根据任务标识在映射表中查找该任务需 要投递的线程ID,然后将任务发送到对应线程的任务队列中,线程池中的线程不断从各自 任务队列中请求新的任务执行,然后输出结果。4.根据权利要求2或3所述的,其特征在于,所 述步骤二包括以下步骤步骤201,使用负载值计算公式,根据新添加任务的频率,计算出该任务的负载数值; 步骤202,采用顺序遍历的方式,查找出所有线程中负载值最小的线程之一; 步骤203,将该负载值添加到202中查找到的最小负载线程上; 步骤204,利用方差计算公式,计算出线程池中所有线程的负载方差; 步骤205,判断204中计算的方差值是否超过预设的LoadMax (默认值为100); 步骤206,如果超过了 LoadMax,需要进行负载均衡;步骤207,计算新添加任务标识的Hash值,并添加到映射表中。如果添加失败,需要将 此任务的负载值从对应线程的负载值中删除。5.根据权利要求2或3所述的,其特征在于,所 述步骤三包括以下步骤步骤301,计算需要被删除的任务标识的Hash值;步骤302,通过Hash值在映射表中找到该任务对应的线程ID,并记录下该任务的负载值;步骤303,从对应线程的总负载值上减去该任务的负载值; 步骤304,利用方差计算公式,计算出线程池中所有线程的负载方差; 步骤305,判断304中计算的方差值是否超过预设的LoadMax (默认值为100); 步骤306,如果超过了 LoadMax,需要进行负载均衡;步骤307,将该任务从映射表中删除。如果删除失败,需要将此任务的负载值从对应线 程的负载值中恢复。6.根据权利要求4所述的,其特征在于,所述 步骤三包括以下步骤步骤301,计算需要被删除的任务标识的Hash值;步骤302,通过Hash值在映射表中找到该任务对应的线程ID,并记录下该任务的负载值;步骤303,从对应线程的总负载值上减去该任务的负载值; 步骤304,利用方差计算公式,计算出线程池中所有线程的负载方差; 步骤305,判断304中计算的方差值是否超过预设的LoadMax (默认值为100); 步骤306,如果超过了 LoadMax,需要进行负载均衡;步骤307,将该任务从映射表中删除。如果删除失败,需要将此任务的负载值从对应线 程的负载值中恢复。7.根据权利要求5所述的,其特征在于,所述 步骤五包括以下步骤步骤401,监视线程一般处于休眠状态,定时激活启动(默认时间间隔为60分钟);步骤402,利用方差计算公式,计算出线程池中所有线程的负载方差; 步骤403,判断402中计算的方差值是否超过预设的LoadMax (默认值为100),如果未 超出,重新进入休眠状态;步骤404&405,如果超出LoadMax,遍历所有线程的负载值,找出负载值最大的线程之 一与负载值最小的线程之一;步骤406,将负载本文档来自技高网...

【技术保护点】
1.一种保证时间连续性的线程池设计方法,其特征在于,所述线程池需要维护一个任务标识到线程ID的Hash映射表,用来对任务的分配进行管理;线程参数增加一个属性参数:负载(nLoad),用以标识各线程所分配的任务总量,该参数以一段时间内该任务到达线程池的频率(nFreq)进行量化,其中时间段(nPeriod)的长度可以根据应用场景进行设置(单位为分钟),量化公式如下:(math)??(mrow)?(mi)nLoad(/mi)?(mo)=(/mo)?(mfrac)?(mrow)?(mi)nPeriod(/mi)?(mo)*(/mo)?(mn)60(/mn)?(/mrow)?(mi)nFreq(/mi)?(/mfrac)?(/mrow)?(/math)如果计算得到的nLoad结果为0,则记为1;所有线程不再共享同一任务队列,而是为线程池中的每一个线程配置一个与之相对应的任务队列,各线程从相应的任务队列中查找新的任务;单独有一监视线程,平时处于休眠状态,会定时启动监测各线程的负载情况,判定的标准为线程的负载参数。

【技术特征摘要】

【专利技术属性】
技术研发人员:王非黄本雄卢正新全中伟邓磊
申请(专利权)人:华中科技大学
类型:发明
国别省市:83

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1