一种调整线程数的方法及装置与流程

文档序号:16735536发布日期:2019-01-28 12:36阅读:196来源:国知局
一种调整线程数的方法及装置与流程
本申请涉及计算机
技术领域
,尤其涉及一种调整线程数的方法及装置。
背景技术
:目前,针对多任务同时处理可采用线程池技术,在同一时刻利用不同线程处理不同任务,达到同时处理多个任务的目的。采用线程池技术,在初始化时可在线程池中创建多个线程和一个任务队列,当有多个任务需要执行时,会将多个任务推入到任务队列中,并从线程池中选择多个空闲的线程分别执行多个任务,当该多个任务执行完毕后,将执行该多个任务的多个线程的状态置为空闲,并将该多个线程再放入线程池中,以使其可以被派发执行新的任务。现有技术中,线程池初始化之后创建的线程数量是固定值。当任务队列中任务较少,线程池中存在较多空闲线程时,会导致线程资源的浪费,反之,当任务队列中任务较多,线程池中空闲线程不足时,又会导致任务处理速度变慢。技术实现要素:本申请实施例提供一种调整线程数的方法及装置,用以实现根据任务数量对线程数量的动态调整,以达到快速处理任务和节省资源之间的动态平衡。第一方面,本申请实施例提供一种调整线程数的方法,该方法包括:采集第一数量和第二数量,第一数量为线程池的任务队列中任务的数量,第二数量为线程池中线程的数量,线程用于处理任务,在采集到第一数量和第二数量之后,可根据第一数量和第二数量确定线程池的状态,该状态包括空闲状态或繁忙状态,空闲状态为第一数量小于第二数量的状态,繁忙状态为第一数量大于第二数量的状态,若确定线程池的状态为繁忙状态,则增加线程池中线程的数量,若确定线程池的状态为空闲状态,则减少线程池中线程的数量。通过上述方法,可根据线程池中任务数量和线程数量确定线程池的状态,进而根据线程池的状态动态调整线程的数量,以使线程池中任务数量与线程数量均衡,从而达到快速处理任务和节省资源之间的动态平衡。在一种可能的设计中,在第一数量和第二数量的比值小于第一预设值时,则可以确定线程池的状态为空闲状态,在第一数量和第二数量的比值大于第二预设值时,则可以确定线程池的状态为繁忙状态,其中,第一预设值为小于或等于1的正数,第二预设值为大于或等于1的正数。通过第一预设值和第二预设值确定线程池的状态,可以较为合理的划分线程池的空闲状态和繁忙状态。在一种可能的设计中,可将繁忙状态进一步细分为一级繁忙状态、二级繁忙状态以及三级繁忙状态。在该种设计中,若比值大于第二预设值且小于第三预设值,则可以确定线程池的状态为一级繁忙状态,若比值大于等于第三预设值且小于第四预设值,则可以确定线程池的状态为二级繁忙状态,若比值大于或等于第四预设值,则可以确定线程池的状态为三级繁忙状态,其中,第三预设值为大于第二预设值的正数,第四预设值为大于第三预设值的正数。这样,后续可根据线程池的繁忙状态进一步确定线程池的繁忙程度,以便做出合理决策。其中,上述第一预设值、第二预设值、第三预设值和第四预设值可以根据预先学习经验确定,或者通过各种仿真模拟方式来确定,本申请不做限定。在一种可能的设计中,第一数量和第二数量按周期采集,针对每个周期确定线程池的状态,状态与积分数值具备对应关系,一级繁忙状态、二级繁忙状态以及三级繁忙状态对应的积分数值为正数,空闲状态对应的积分数值为负数。在该种设计中,针对当前周期确定线程池的状态之后,还包括:根据状态与积分数值的对应关系,以及针对当前周期确定的线程池的状态,确定与当前周期确定的线程池的状态对应的第一积分数值,将第一积分数值和历史积分数值之和,确定为与针对当前周期确定的线程池的状态对应的第二积分数值,其中历史积分数值是指针对当前周期之前的每个周期确定的与线程池的状态对应的积分数值之和。这样,若确定第二积分数值大于或等于第五预设值,则在线程池中增加第一预设数量个线程。若确定第二积分数值小于或等于第六预设值,则减少线程池中第二预设数量个线程,第五预设值为正数,第六预设值为负数。其中,上述第五预设值、第六预设值、第一预设数量和第二预设数量也可以根据预先学习经验确定,或者通过各种仿真模拟方式来确定,本申请不做限定。这样,通过将线程池的状态与积分对应,进而可根据积分值判断线程池的繁忙程度,当积分值达到阀值时调整线程池中的线程数量,可平滑的创建或销毁线程。且,该方法不仅考虑当前周期下线程池的状态对应的积分值,还将当前周期之前的周期统计的积分值考虑在内,可使线程数量调整过程尽量平滑,避免频繁创建和销毁线程带来额外开销。在一种可能的设计中,第一预设数量和第二预设数量可以均为一。通过该方法,将每次增加或减少的线程数设为1,可使线程数量调整过程尽量平滑,避免频繁创建和销毁线程带来额外开销。在一种可能的设计中,本申请还可以执行下述操作中的任意一种或多种:在确定第一积分数值为正数,且历史积分数值为负数时,可将历史积分数值置零;或者,在确定第一积分数值为负数,且历史积分数值为正数时,可将历史积分数值置零;或者,在确定历史积分数值大于或等于第五预设值时,可将历史积分数值置零;或者,在确定历史积分数值小于或等于第六预设值时,可将历史积分数值置零;或者,在确定第二积分数值大于或等于第五预设值,且当前线程池中的线程数量等于预设的最大线程数量时,可将当前状态对应的第二积分数值置零;或者,在确定第二积分数值小于或等于第六预设值,且当前线程池中的线程数量等于预设的最小线程数量时,可将当前状态对应的第二积分数值置零。一些场景下线程池的状态不会持续的保持在空闲状态或繁忙状态,而是在空闲状态和繁忙状态之间进行迁移。针对该些场景,采用上述方法可根据第一积分数值和历史积分数值的符号,确定线程池的状态是否在空闲状态和繁忙状态之间进行迁移,由于上述方法中设置繁忙状态对应的积分数值为正数,空闲状态对应的积分数值为负数,故当第一积分数值和历史积分数值的符号(正负)不同时,可确定线程池的状态在空闲状态和繁忙状态之间进行迁移,进而可将历史积分数值清零,重新计算第二积分值,可避免频繁的创建和销毁线程。此外,若历史积分数值或第二积分数值超过调整线程数的预设阈值,则将历史积分数值或第二积分数值清零,避免后续计算出错。在一种可能的设计中,还可以在确定当前线程池中包括的线程数量小于预设的最大线程数量时,再在线程池中增加第一预设数量个线程;或者,还可以在确定当前线程池中包括的线程数量大于预设的最小线程数量时,再减少线程池中第二预设数量个线程。这样,可避免线程数超过用户设置的阈值。第二方面,本申请实施例提供一种调整线程数的装置,包括用于执行以上第一方面各个步骤的单元或手段(means)。第三方面,本申请实施例提供一种调整线程数的装置,包括至少一个处理器和存储器,所述存储器存储有计算机程序,所述至少一个处理器用于调用所述计算机程序执行以上第一方面提供的方法。第四方面提供一种计算机可读存储介质,其上存储有一些指令,这些指令被计算机调用执行时,可以使得计算机完成上述第一方面、第一方面的任意一种可能的设计中所涉及的方法。第五方面提供一种计算机程序产品,该计算机程序产品在被计算机调用执行时可以完成第一方面以及上述第一方面任意可能的设计中所涉及的方法。附图说明图1为本申请实施例提供的一种线程池实现方案;图2为本申请实施例提供的一种系统架构示意图;图3为本申请实施例提供的一种调整线程数的方法流程示意图;图4为本申请实施例提供的另一种调整线程数的方法流程示意图;图5为本申请实施例提供的一种调整线程数的装置结构示意图;图6为本申请实施例提供的另一种调整线程数的装置结构示意图。具体实施方式为了使本申请实施例的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施例作进一步地详细描述。以下,对本申请实施例中的部分用语进行解释说明,以便于本领域技术人员理解。(1)线程池技术,是指在同一时刻可利用不同线程处理不同任务的技术。参阅图1所示,其为一种线程池实现方案,采用线程池技术,在初始化时可在线程池中创建n个线程和一个任务队列,其中n为用户根据实际应用设置的固定值,图1中的n为大于或等于6的整数。当有多个任务需要执行时,会将多个任务推入到任务队列中,图1中以将任务1、任务2以及任务3推入到任务队列为例,当有3个任务需要执行时,可从线程池中选择3个空闲的线程,例如线程1、线程2以及线程3来分别执行该3个任务,当该3个任务执行完毕后,将线程1、线程2以及线程3的状态置为空闲,并将线程1、线程2以及线程3再次放入线程池中,以使其可以被派发执行新的任务。需要说明的是,图1中以一个线程处理一个任务为例说明,实际应用中一个线程也可处理多个任务,例如,一个线程也可以处理两个或三个任务等。(2)线程,是程序执行的最小单元,是被系统独立调度的基本单位。线程池中的线程可包括两种状态,分别为空闲状态和工作状态。空闲状态是指线程具备处理任务的条件,逻辑上可以处理任务,但当前不处理任务的状态。工作状态是指线程正在处理任务的状态。(3)“多个”是指两个或两个以上,其它量词与之类似。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。“第一”,“第二”,“第三”,及“第四”等词汇,仅用于区分描述的目的,而不能理解为指示或暗示相对重要性,也不能理解为指示或暗示顺序。随着计算机技术的发展,对多任务同时处理提出更高的需求。目前,针对多任务同时处理可采用线程池技术。但是采用现有的线程池技术,在线程池初始化之后创建的线程数量是固定值。当任务队列中任务较少,线程池中存在较多空闲线程时,会导致线程资源的浪费,反之,当任务队列中任务较多,线程池中空闲线程不足时,又会导致任务处理速度变慢。基于此,本申请实施例提供一种调整线程数的方法及装置,用以实现根据任务数量对线程数量的动态调整,以达到快速处理任务和节省资源之间的动态平衡。参阅图2所示,其为本申请实施例提供的一种系统架构示意图。如图2所示,该系统架构包括线程池和调整线程数的装置,线程池中包括任务队列和线程,任务队列中存储待执行的任务,调整线程数的装置包括数据采集模块、处理模块以及线程调整模块。其中,数据采集模块用于采集第一数量和第二数量,第一数量为线程池的任务队列中任务的数量,第二数量为线程池中线程的数量,线程用于处理任务。处理模块,用于根据数据采集模块采集的第一数量和第二数量,确定线程池的状态,该状态可包括空闲状态或繁忙状态,空闲状态为第一数量小于第二数量的状态,繁忙状态为第一数量大于第二数量的状态。线程调整模块,用于在处理模块确定线程池的状态为繁忙状态时,增加线程池中线程的数量,在处理模块确定线程池的状态为空闲状态时,减少线程池中线程的数量。通过上述调整线程数的装置,可根据线程池中任务数量和线程数量确定线程池的状态,进而根据线程池的状态动态调整线程的数量,以使线程池中任务数量与线程数量均衡,进而达到快速处理任务和节省资源之间的动态平衡。参阅图3所示,其为本申请实施例提供的一种调整线程数的方法流程示意图,该方法包括:s101:采集第一数量和第二数量。第一数量为线程池的任务队列中任务的数量,第二数量为线程池中线程的数量,所述的线程用于处理所述的任务。本申请下文中以将该调整线程数的方法应用于调整线程数的装置为例进行说明。本申请实施例中,调整线程数的装置在采集第一数量和第二数量之前,线程池可执行s100a和/或s100b。s100a执行线程池初始化,可在线程池中创建出多个线程以及一个任务队列。线程池初始化之后,线程池还可执行s100b,s100b中线程池接收线程池的应用者发送的任务,并将接收到的任务推入任务队列,进而可调度空闲线程处理任务队列中的任务。本申请中调整线程数的装置可按周期采集第一数量和第二数量,当然也可不定时采集第一数量和第二数量,本申请不做限定。s102:调整线程数的装置采集第一数量和第二数量之后,可根据第一数量和第二数量确定线程池的状态。其中,线程池的状态可包括空闲状态或繁忙状态,空闲状态为第一数量小于第二数量的状态,繁忙状态为第一数量大于第二数量的状态。此外,线程池的状态还可以包括不忙不闲状态,不忙不闲状态可以是第一数量等于第二数量的状态。需要说明的是,上述s102中仅给出一种可能的划分线程池的状态的方法。在实际应用中,还可根据任务和线程之间的调度关系,对线程池的状态进行其它划分。一种可能的实现方式中,调整线程数的装置可采用如下方式确定线程池的状态:若第一数量和第二数量的比值小于第一预设值,则确定线程池的状态为空闲状态,若第一数量和第二数量的比值大于第二预设值,则确定线程池的状态为繁忙状态。其中,第一预设值可以为小于或等于1的正数,第二预设值可以为大于或等于1的正数。本申请实施例中,以下若无特殊说明,比值均是指第一数量和第二数量的比值。本申请实施例中对第一预设值和第二预设值的取值不做限定。第一预设数量和第二预设数量可以是经验值,或者通过各种仿真模拟方式来确定,当然,第一预设值和第二预设值的取值也可根据任务和线程之间的调度关系确定。例如,针对一个线程用于处理一个任务的调度关系,可将第一预设值设置为1,可将第二预设值设置为2,当然也可以设置其它值,例如还可将第一预设值设置为0.9,将第二预设值设置为3,本申请不做限定。又例如,针对一个线程可用于处理两个任务的调度关系,可将第一预设值设置为2,可将第二预设值设置为4,当然也可以设置其它值,例如还可将第一预设值设置为1,将第二预设值设置为3,本申请不做限定。需要说明的是,下文中所涉及的第一预设值和第二预设值均是指此处描述的含义,再次出现时不再赘述。s103:调整线程数的装置若确定线程池的状态为繁忙状态,则执行s103a,增加线程池中线程的数量。本申请中,增加线程池中线程的数量,也可理解为在线程池中创建新的线程。s104:调整线程数的装置若确定线程池的状态为空闲状态,则执行s104a,减少线程池中线程的数量。本申请中,减少线程池中线程的数量,也可理解为销毁线程池中已创建的线程。此外,调整线程数的装置若确定线程池的状态为不忙不闲状态,则可不调整线程池中线程的数量。不调整线程池中线程的数量,可以理解为既不增加线程池中线程数量也不减少线程池中线程数量。通过本申请实施例提供的方法,调整线程数的装置可根据线程池中任务数量和线程数量确定线程池的状态,进而根据线程池的状态动态调整线程池中线程的数量,以使线程池中任务数量与线程数量均衡,进而达到快速处理任务和节省资源之间的动态平衡。需要说明的是,本申请实施例中s103和s104择一执行,s103a和s104a择一执行。本申请中,线程数量也可描述为线程数,均表达线程的数量,不做区分。采用本申请上述提供的方法,当任务队列中的任务较多时,线程池可能持续处于繁忙状态,触发调整线程数的装置不断增加线程池中的线程数量,进而导致调整线程数的装置频繁的创建新的线程。基于此,本申请实施例中可根据繁忙程度将繁忙状态进一步细分为一级繁忙状态、二级繁忙状态以及三级繁忙状态。用三种不同的繁忙状态来区分线程池的繁忙程度,可以使调整线程数的装置可根据线程池的繁忙程度作出不同的线程调整策略。例如,线程池的繁忙程度较高时可立即增加线程池中的线程。又例如,线程池的繁忙程度较低时不必立即增加线程池中的线程,继续考察一段时间内线程池的状态,进一步决策是否需要调整线程池中的线程数量。需要说明的是,如何划分一级繁忙状态、二级繁忙状态以及三级繁忙状态,本申请不做限定。一种可能的实现方式中,在第一数量和第二数量的比值大于第二预设值且小于第三预设值时,可以确定线程池的状态为一级繁忙状态,在第一数量和第二数量的比值大于等于第三预设值且小于第四预设值时,可以确定线程池的状态为二级繁忙状态,在第一数量和第二数量的比值大于或等于第四预设值时,可以确定线程池的状态为三级繁忙状态。其中,第三预设值为大于第二预设值的正数,第四预设值为大于第三预设值的正数。本申请实施例中,对第三预设值和第四预设值的取值不做限定。第三预设值和第四预设值可以是经验值,或者通过各种仿真模拟方式来确定,当然,第三预设值和第四预设值的取值也可根据任务和线程之间的调度关系确定。例如,针对一个线程用于处理一个任务的调度关系,可将第三预设值设置为3,可将第四预设值设置为4,当然也可以设置其它值,又例如还可将第三预设值设置为4,将第四预设值设置为5,再例如,还可将第三预设值设置为5,将第四预设值设置为6。例如,针对一个线程可用于处理两个任务的调度关系,可将第三预设值设置为5,可将第四预设值设置为6,当然也可以设置其它值,又例如还可将第三预设值设置为6,将第四预设值设置为7,本申请不做限定。需要说明的是,下文中所涉及的第三预设值和第四预设值均是指此处描述的含义,再次出现时不再赘述。参见表1所示,为本申请提供的一种线程池的状态的划分情况:表1t与w的比值t/w<11≤t/w≤22<t/w<33≤t/w<44≤t/w线程池的状态空闲状态不忙不闲状态一级繁忙状态二级繁忙状态三级繁忙状态在表1所示的线程池的状态划分情况中,t表示第一数量,即线程池的任务队列中任务的数量,w表示第二数量,即线程池中线程的数量。表1中以第一预设值为1、第二预设值为2、第三预设值为3以及第四预设值为4为例示意。其中,三级繁忙状态的繁忙程度高于二级繁忙状态和一级繁忙状态,二级繁忙状态的繁忙程度高于一级繁忙状态。需要说明的是,以下若无特殊说明,本申请所涉及的t均表示第一数量,w均表示第二数量。本申请下文中以调整线程数的装置按周期采集第一数量和第二数量为例说明。当调整线程数的装置按周期采集第一数量和第二数量时,可针对每个周期确定线程池的状态。但是若针对每一采集周期调整线程池中线程数量,可能会导致线程调整过于频繁,而频繁的创建或销毁线程进而会带来额外的开销。本申请实施例中,为了使线程调整过程尽量平滑,避免频繁创建或销毁线程带来额外的系统开销,本申请提供另一种调整线程数的方法,在该方法中设置线程池的状态与积分数值具备对应关系,这样,可针对每个周期根据该对应关系确定每个周期中线程池的状态对应的积分数值,若各个周期确定的积分数值之和(下文中也可称为累计积分数值)达到一定阀值,则调整线程池中的线程数量,以避免频繁的创建或销毁线程。下面以表1中线程池的状态的划分情况为例,对本申请提供的另一种调整线程数的方法进行说明。参阅图4所示,其为本申请实施例提供的另一种调整线程数的方法流程示意图,该方法包括:s201:调整线程数的装置按周期采集第一数量和第二数量。该实施例中所涉及的第一数量和第二数量的含义与图3中实施例的含义相同,可参见图3中的描述,此处不再赘述。本申请实施例中,调整线程数的装置在采集第一数量和第二数量之前,线程池可执行s200a和/或s200b。s200a与s100a相同,s200b与s100b相同,关于s200a和s200b可参见s100a和s100b的描述,此处不再赘述。s202:调整线程数的装置按周期采集第一数量和第二数量之后,可针对每个周期确定线程池的状态。该实施例中所涉及的线程池的状态的含义与图3中实施例的含义相同,可参见图3中的描述,此处不再赘述。该实施例中配置线程池的状态与积分数值具备对应关系。可选的,调整线程数的装置可用不同符号的积分数值(负数、0、正数)对应“空闲状态”、“不忙不闲状态”以及“繁忙状态”三种不同的线程池状态,这样可以使调整线程数的装置根据积分数值的符号(正、负、零)方便的判断线程池的当前状态。本申请实施例中并不限定积分数值的符号与线程池状态的对应关系。示例性的,可以将繁忙状态(一级繁忙状态、二级繁忙状态以及三级繁忙状态)对应的积分数值设置为正数,空闲状态对应的积分数值设置为负数,并将不忙不闲状态对应的积分数值设置为零。示例性的,还可以将繁忙状态(一级繁忙状态、二级繁忙状态以及三级繁忙状态)对应的积分数值设置为负数,空闲状态对应的积分数值设置为正数,并将不忙不闲状态对应的积分数值设置为零。本申请实施例中,以将繁忙状态(一级繁忙状态、二级繁忙状态以及三级繁忙状态)对应的积分数值设置为正数,空闲状态对应的积分数值设置为负数,将不忙不闲状态对应的积分数值设置为零为例,进行说明。此外,本申请实施例中,对积分数值取何种数值不做限定。该积分数值用于唯一标识线程池不同的状态,不做其它限定。例如,若将一级繁忙状态对应的积分数值设置为1,则表示积分数值为1的状态只可以是一级繁忙状态。又例如,若将空闲状态对应的积分数值设置为负3,则表示积分数值为负3的状态只可以是空闲状态。参见表2所示,为本申请提供的一种线程池的状态与积分数值的对应关系:表2t与w的比值t/w<11≤t/w≤22<t/w<33≤t/w<44≤t/w线程池的状态空闲状态不忙不闲状态一级繁忙状态二级繁忙状态三级繁忙状态积分数值-10123表2为基于表1中线程池的状态的划分情况提供的一种线程池的状态与积分数值的对应关系。表2中以空闲状态对应的积分数值为负1,不忙不闲状态对应的积分数值为零,一级繁忙状态对应的积分数值为1,二级繁忙状态对应的积分数值为2,三级繁忙状态对应的积分数值为3为例示意。线程池的状态对应的积分数值也可设置为其它值,不限于表2中示意数值。例如,空闲状态对应的积分数值也可以设置为负4或负5等,不忙不闲状态对应的积分数值设置为零,一级繁忙状态对应的积分数值也可以设置为2、3或4等,二级繁忙状态对应的积分数值也可以设置为5、6或7等,三级繁忙状态对应的积分数值也可以设置为8、9或10等。调整线程数的装置针对任一周期确定线程池的状态之后,可根据线程池的状态与积分数值的对应关系,以及确定的线程池的状态,确定与线程池的状态对应的积分数值。调整线程数的装置确定任一周期中与线程池的状态对应的积分数值之后,还可存储该积分数值,以便后续使用。下面以针对当前采集周期实施本申请实施例提供的另一种调整线程数的方法为例说明。s203:调整线程数的装置针对当前周期确定线程池的状态之后,根据线程池的状态与积分数值的对应关系,以及针对当前周期确定的线程池的状态,确定与线程池的状态对应的第一积分数值。若所述的当前周期为初始周期,则调整线程数的装置在确定与线程池的状态对应的第一积分数值之后执行s204a,若所述的当前周期为非初始周期,则调整线程数的装置在确定与线程池的状态对应的第一积分数值之后执行s204b。需要说明的是,初始周期是指调整线程数的装置执行图4中方法的首个周期,非初始周期是与初始周期相对应的一个概念,是指除初始周期之外的其它周期。s204a:调整线程数的装置确定当前周期为初始周期,将针对当前周期确定的线程池的状态对应的第一积分数值分别与第五预设值和第六预设值进行比较,判断该第一积分数值是否大于或等于第五预设值,若该第一积分数值大于或等于第五预设值,则执行s205a1,在线程池中增加第一预设数量个线程,若该第一积分数值小于第五预设值,则执行s202,也就是说不调整线程池中的线程数,继续针对每个周期确定线程池的状态。判断该第一积分数值是否小于或等于第六预设值,若该第一积分数值小于或等于第六预设值,则执行s205a2,减少线程池中第二预设数量个线程,若该第一积分数值大于第六预设值,则执行s202,也就是说不调整线程池中的线程数,继续针对每个周期确定线程池的状态。其中第五预设值和第六预设值是指调整线程数的积分阀值。第五预设值可以为正数,可以理解为针对繁忙状态设置的阈值,也可以理解为当线程池的繁忙状态对应的积分数值大于或等于第五预设值时,繁忙程度达到线程池可支持的最大繁忙程度,最好立即增加线程池中的线程数量,例如可以在线程池中增加第一预设数量个线程。第六预设值可以为负数,可以理解为针对空闲状态设置的阈值,也可以理解为当线程池的空闲状态对应的积分数值小于或等于第六预设值时,空闲程度达到线程池可支持的最大空闲程度,最好减少线程池中的线程数量,例如可以减少线程池中第二预设数量个线程。本申请实施例中,第五预设值和第六预设值的取值与线程池的状态对应的积分数值的取值相关,该积分数值的取值越大第五预设值和第六预设值的取值也越大,反之,该积分数值的取值越小第五预设值和第六预设值的取值也越小,也就是说第五预设值和第六预设值的取值与该积分数值的取值可以呈正相关。示例性的,以表2中线程池的状态与积分数值的对应关系为例说明。第五预设值可以理解为针对繁忙状态设置的阈值,例如,若用户希望一旦线程池的状态达到三级繁忙状态,则立即增加线程池中的线程数,则可将第五预设值设置为3,又例如,若用户希望线程池的状态超过三级繁忙状态才增加线程池中的线程数,则可将第五预设值设置为4、5或6等。示例性的,以表2中线程池的状态与积分数值的对应关系为例说明。第六预设值可以理解为针对空闲状态设置的阈值,例如,若用户希望线程池的状态连续三次处于空闲状态,才减少线程池中的线程数,则可将第六预设值设置为负3,又例如,若用户希望线程池的状态连续五次处于空闲状态,才减少线程池中的线程数,则可将第六预设值设置为负5。也就是说第六预设值与空闲状态对应的积分数值以及线程池可连续处于空闲状态的最大次数相关。一种可能的实现方式中,第六预设值的取值可以为空闲状态对应的积分数值与线程池可连续处于空闲状态的最大次数的乘积。例如,若空闲状态对应的积分数值为负2,线程池可连续处于空闲状态的最大次数为4,则第六预设值的取值可以为负8。其中线程池可连续处于空闲状态的最大次数,也可以理解为系统可容忍线程池连续处于空闲状态的次数。需要说明的是,下文中所涉及的第五预设值和第六预设值均是指此处描述的含义,再次出现时不再赘述。s204b:调整线程数的装置确定当前周期为非初始周期,在针对当前周期确定线程池的状态对应的第一积分数值之后,将第一积分数值和历史积分数值之和,确定为与针对当前周期确定的线程池的状态对应的第二积分数值,将该第二积分数值分别与第五预设值和第六预设值进行比较,判断该第二积分数值是否大于或等于第五预设值,若该第二积分数值大于或等于第五预设值,则执行s205b1,在线程池中增加第一预设数量个线程,若该第二积分数值小于第五预设值,则执行s202,也就是说不调整线程池中的线程数,继续针对每个周期确定线程池的状态。判断该第二积分数值是否小于或等于第六预设值,若该第二积分数值小于或等于第六预设值,则执行s205b2,减少线程池中第二预设数量个线程,若该第二积分数值大于第六预设值,则执行s202,也就是说不调整线程池中的线程数,继续针对每个周期确定线程池的状态。其中,历史积分数值是指针对当前周期之前的每个周期确定的与线程池的状态对应的积分数值之和。需要说明的是,本申请实施例中204a和204b择一执行。可以理解为,s204b中针对当前周期计算第二积分数值,可采用如下公式:第二积分数值=第一积分数值+历史积分数值;调整线程数的装置在每个周期采集完线程池的线程数量和任务数量之后,根据线程池的状态与积分数值的对应关系,以及当前周期确定的线程池的状态,确定与当前线程池的状态对应的第一积分数值,并根据第二积分数值的计算公式对当前“历史积分数值”进行更新并存储。当下一个周期来临时,将该历史积分数值做为当前周期的“历史积分数值”再次参与运算。本申请实施例中对第一预设数量和第二预设数量的取值不做限定。第一预设数量和第二预设数量取值的原则是基于使得线程池中线程调整尽量平滑的原则。可选的,为使线程数量调整过程尽量平滑,避免频繁创建和销毁线程带来额外开销,可设置第一预设数量和第二预设数量均为一,这样,调整线程数的装置可以每次增加或者减少一个线程,以避免一次性增加或减少太多个线程导致下个周期线程池的状态发生较大变化,例如从空闲状态突变为三级繁忙状态,进而导致调整线程数的装置需要不断的调整线程池中的线程数。当然第一预设数量和第二预设数量也可以取值为2或3等,本申请不做限定。参见表3所示,为本申请提供的一种调整线程数的积分阀值与调整线程数的对应关系:表3第二积分数值≤-3≥3线程数调整减少1个线程增加1个线程表3中以第五预设值为3,第六预设值为负3,第一预设数量和第二预设数量为1为例示意说明。当针对当前周期计算的第二积分数值小于或等于第六预设值时,减少线程池中1个线程,也可以理解为销毁线程池中的1个线程,当针对当前周期计算的第二积分数值大于或等于第五预设值时,在线程池中增加1个线程,也可以理解为在线程池中创建1个新的线程。更进一步地,调整线程数的装置可以在确定当前线程池中包括的线程数量小于预设的最大线程数量的情况,再决定在线程池中增加第一预设数量个线程。当然,调整线程数的装置还可以在确定当前线程池中包括的线程数量大于预设的最小线程数量的情况下,再决定减少线程池中第二预设数量个线程。这样,可避免线程数超过预先设置的阈值。可选的,预设的最大线程数量以及预设的最小线程数量可由用户设置,用户可根据实际应用场景,确定较合适的最大线程数量和最小线程数量。例如,若用户确定使用该线程池和方法的系统,最大可支持的线程数量为50,则可将预设的最大线程数量设置为50,相应的,若用户确定使用该线程池和方法的系统,最小可支持的线程数量为3,则可将预设的最小线程数量设置为3。可以理解的是,本申请中线程池中的线程数可以在预设的最小线程数量和预设的最大线程数量之间进行调整,这使得使用线程池的开发者可以方便的处理同一程序在不同环境下运行时线程数量的设置差异,可简化程序设计和使用的复杂性。参见表4所示,为本申请提供的一种线程数的调整范围与设置的关系:表4预设的阀值预设的最大线程数量预设的最小线程数量设置由用户设置由用户设置表4中以用户设置预设的最大线程数量以及预设的最小线程数量为例示意,当然,也可以是其它方式设置,本申请不做限定。通过图4提供的方法,将线程池的状态与积分对应,进而可根据积分值判断线程池的繁忙程度,当积分值达到阀值时调整线程池中的线程数量。且,该方法不仅考虑当前周期下线程池的状态对应的积分值,还将当前周期之前的周期统计的积分值考虑在内,可使线程数量调整过程尽量平滑,避免频繁创建和销毁线程带来额外开销。一些场景下线程池的状态不会持续的保持在空闲状态或繁忙状态,而是在空闲状态、不忙不闲状态和繁忙状态之间不断进行切换。例如假设针对初始周期确定的线程池的状态为空闲状态,针对初始周期的下一个周期确定的线程池的状态为一级繁忙状态,针对初始周期的下两个周期确定的线程池的状态为不忙不闲状态,依次类推,线程池的状态在空闲状态、繁忙状态以及不忙不闲状态之间进行切换。显然,若针对这些场景调整线程数量的话,可能需要频繁的创建和销毁线程。为了使线程池的线程数调整平滑地进行,避免因频繁的创建和销毁线程产生额外的系统开销,希望调整线程数的情况是:在某段时间内线程池“持续”保持繁忙状态并达到调整阀值的情况,或者,在某段时间内线程池“持续”保持空闲状态并达到调整阀值的情况。也就是说,针对在某段时间内线程池在空闲状态、不忙不闲状态以及繁忙状态之间切换的情况,可不调整线程池中的线程数。基于上述描述,本申请提供又一种调整线程数的方法中,可以执行下述操作中的一项或多项,比如操作包括:若确定第一积分数值为正数,且历史积分数值为负数,则将历史积分数值置零;或者,若确定第一积分数值为负数,且历史积分数值为正数,则将历史积分数值置零;或者,若确定第一积分数值为零,且历史积分数值为正数或负数,则将历史积分数值置零。这样,可根据第一积分数值和历史积分数值的符号(正、负、零)判断两个周期中线程池的状态是否在空闲状态、不忙不闲状态和繁忙状态之间切换,若第一积分数值和历史积分数值的符号不同,则可确定线程池的状态在空闲状态、不忙不闲状态以及繁忙状态之间切换,为避免这种情况下调整线程数,本申请可将该情况下的历史积分数值置零,重新计算历史积分数值。本申请中,将历史积分数值置零,也可以理解为将历史积分数值清零,均表示重新计算历史积分数值。此外,若历史积分数值超过第五预设值或第六预设值,则说明已经调整过一次线程数,该种情况下,可以重新开始计算积分数值,即,可将历史积分数值置零。具体的,若确定历史积分数值大于或等于第五预设值,则将历史积分数值置零;或者,若确定历史积分数值小于或等于第六预设值,则将历史积分数值置零。此外,若第二积分数值大于或等于第五预设值,而当前所述线程池中的线程数量等于预设的最大线程数量,说明线程池中的线程数已达到用户设置的上限,不可再增加线程,故此时应该将第二积分数值清零,在下一采集周期内重新计算积分数值。若第二积分数值小于或等于第六预设值,而当前所述线程池中的线程数量等于预设的最小线程数量,说明线程池中的线程数已达到用户设置的下限,不可再减少线程,故此时应该将第二积分数值清零,在下一采集周期内重新计算积分数值。本申请实施例提供的另一种调整线程数的方法中,采用积分机制对线程池的繁忙程度进行评估,用积分数值的符号(负数、0、正数)来表示线程池的状态,并通过积分清零机制使线程调整过程更加平滑。且采用不同的计分区间来区别不同的繁忙程度,使在高繁忙程度(例如三级繁忙状态)下触发线程数调整的时间更短。基于与方法实施例的同一发明构思,本申请实施例还提供一种调整线程数的装置。可以理解的是,该调整线程数的装置为了实现上述功能,其包含了执行各个功能相应的硬件结构和/或软件模块。本领域技术人员应该很容易意识到,结合本文中所公开的实施例描述的各示例的算法步骤,本申请能够以硬件或硬件和计算机软件的结合形式来实现。某个功能究竟以硬件还是计算机软件驱动硬件的方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。在采用集成单元的情况下,图5示出了本申请实施例涉及的调整线程数的装置的一种可能的结构示意图。如图5所示,所述调整线程数的装置500包括数据采集模块501、处理模块502以及线程调整模块503(具体也可以参照图2所示)。数据采集模块501用于采集数据,例如数据采集模块501可用于执行图3中的s101以及图4中的s201等技术过程。处理模块502用于对调整线程数的装置500的动作进行控制管理,例如处理模块502可以用于执行图3中的s102、s103、s104,以及图4中的s202、s203、s204a、s204b等技术过程。线程调整模块503可用于支持调整线程数的装置500与线程池交互,例如线程调整模块503可以用于执行图3中的s103a、s104a等技术过程。其中,处理模块502和线程调整模块503可以集成为一个器件,例如可以集成为处理器或控制器,例如可以是通用中央处理器(centralprocessingunit,cpu),通用处理器,数字信号处理(digitalsignalprocessing,dsp),专用集成电路(applicationspecificintegratedcircuits,asic),现场可编程门阵列(fieldprogrammablegatearray,fpga)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本发明公开内容所描述的各种示例性的逻辑方框,模块和电路。所述处理器也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,dsp和微处理器的组合等等。数据采集模块501可以是射频芯片、射频电路等。当处理模块502和线程调整模块503集成为处理器,数据采集模块501为收发器时,本申请实施例所涉及的调整线程数的装置500可以为图6所示的装置。参阅图6所示,为本申请的实施例提供的上述实施例中所涉及的调整线程数的装置的一种可能的逻辑结构示意图。如图6所示,该调整线程数的装置600可以包括至少一个处理器601。在本申请的实施例中,处理器601用于对该装置的动作进行控制管理,可选的,调整线程数的装置600还可以包括存储器602以及收发器603。处理器601、存储器602以及收发器603可以相互连接或通过总线604相互连接。其中,该存储器602,用于存储调整线程数的装置600的代码和数据。收发器603用于支持该调整线程数的装置600与线程池交互。下面对该调整线程数的装置600的各个构成部件进行具体的介绍:处理器601是设备的控制中心,可以是一个处理器,也可以是多个处理元件的统称。例如,处理器601是一个cpu,也可以是通过asic的方式实现,或者是被配置成实施本发明实施例的一个或多个集成电路,例如:一个或多个dsp,或,一个或者多个fpga。其中,处理器601可以通过运行或执行存储在存储器602内的软件程序,以及调用存储在存储器602内的数据,执行所述调整线程数的装置600的各种功能。存储器602可以是只读存储器(read-onlymemory,rom)或可存储静态信息和指令的其他类型的静态存储设备,随机存取存储器(randomaccessmemory,ram)或者可存储信息和指令的其他类型的动态存储设备,也可以是电可擦可编程只读存储器(electricallyerasableprogrammableread-onlymemory,eeprom)、只读光盘(compactdiscread-onlymemory,cd-rom)或其他光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质或者其他磁存储设备、或者能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。存储器602可以是独立存在,通过通信总线604与处理器601相连接。存储器602也可以和处理器601集成在一起。收发器603,用于与其他节点进行交互,例如线程池等。通信总线604,可以是工业标准体系结构(industrystandardarchitecture,isa)总线、外部无人机身份识别设备互连(peripheralcomponent,pci)总线或扩展工业标准体系结构(extendedindustrystandardarchitecture,eisa)总线等。该总线可以分为地址总线、数据总线、控制总线等。为便于表示,图6中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。图6中示出的设备结构并不构成对调整线程数的装置的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。图6所示的调整线程数的装置600中,处理器601调用存储器602中存储的计算机程序并执行,可以通过收发器603完成上述方法实施例中的各个实施例的具体过程,这里不再一一详述。基于与上述方法实施例相同构思,本申请实施例中还提供一种计算机存储介质,所述计算机存储介质存储有计算机可执行指令,所述计算机可执行指令在被计算机调用时,使所述计算机执行上述提供的方法实施例中的各个实施例的具体过程。本申请实施例中,对所述计算机可读存储介质不做限定,例如,可以是ram(random-accessmemory,随机存取存储器)、rom(read-onlymemory,只读存储器)等。基于与上述方法实施例相同构思,本申请实施例中还提供一种计算机程序产品,所述计算机程序产品中存储有指令,当其在计算机上运行时,使得计算机执行上述任意一种可能的设计中提供的方法。本领域内的技术人员应明白,本申请实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的设备。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令设备的制造品,该指令设备实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。尽管已描述了本申请中一些可能的实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括本申请实施例以及落入本申请范围的所有变更和修改。显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1