具体实施方式
在现有技术中,服务平台通常采用两种方式进行任务执行。
一、所有类型的任务都共有一个线程池,这种方式没有将不同任务类型执行所需的资源(即线程)进行隔离。
二、服务平台分别为每个任务类型分配不同的线程池,各个任务类型的任务使用各自对应的线程池中的线程进行任务执行。这种方法虽然能够实现不同任务类型的任务在执行过程中的资源隔离,然而,随着服务平台不断的向用户推出新的服务,新任务类型的任务也将不断出现,服务平台为了进一步的保证各任务类型的任务在执行过程中的资源隔离,也将对出现的新任务类型的任务分配一个新的线程池。长此以往下去,服务平台中用于进行业务执行的线程池将越来越多,服务平台维护各线程池所消耗的资源也越来越多,从而使得服务平台的负载也不断的增高。
不仅如此,对于一种服务来说,该服务的需求量是呈动态变化的,有时较高、有时则较低。而在需求量较低时,与该服务相对应的任务类型的任务在数量上也较少,占用线程池(即该任务类型对应的线程池)中的线程的数量也较低,从而可能会使该线程池出现大量的闲置线程。而由于不同任务类型的任务只能使用各自任务类型对应线程池中的线程,无法使用其他任务类型对应线程池中的线程。所以,同一时间需求量高的服务将无法使用闲置的这些线程用于任务的执行,这样就极大的降低了任务执行过程中的资源利用率。
因此,为解决上述问题,本说明书提供了一种任务执行的方法,该方法中在监测到线程池中线程的占用情况出现变化时,可以根据变化后的线程占用情况,确定各任务类型对应的优先级,进而根据确定出的各任务类型对应的优先级,从任务队列中调取任务并执行,其中,线程池可以向至少两种任务类型的任务提供线程。由于各任务在执行过程中时刻伴随着线程的占用与释放,所以,根据线程占用情况所确定出的各任务类型所对应的优先级是动态变化的。因此,可以基于动态变化的优先级,决定从任务队列中调取哪种任务类型的任务并执行。这样即可以根据动态变化的优先级有效的平衡各任务类型的任务所占用的资源,实现了对各项任务执行所需资源的合理分配。并且,由于线程池可以对应至少两种任务类型,所以,服务平台中线程池的数量也将不会随着新服务的增多而快速增长,从而在一定程度上降低了服务平台的负载压力。
在本说明书中,可以设置多个线程池,每个线程池可以向至少两种任务类型的任务提供执行任务所需的线程,而不同线程池可以为不完全相同的任务类型的任务提供线程。当然,不同线程池也可以为完全不同的任务类型的任务提供线程,即,任意两个线程池所对应的任务类型均不相同。这样则在一定程度上做到了任务执行过程中的资源隔离,从而保证了各任务的稳定执行。
在本说明书中,一个任务在执行过程中可以占用一个线程,也可占用多个线程。如,服务器在执行任务时,可将该任务拆分成多个子任务,每个子任务在执行的过程中可以分别占用一个线程,而服务器可以将执行各子任务后所得的结果进行合并,得到执行该任务的最终结果。
为了使本技术领域的人员更好地理解本说明书一个或多个实施例中的技术方案,下面将结合本说明书一个或多个实施例中的附图,对本说明书一个或多个实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
在本说明书中,进行任务执行的执行主体可以是服务器、终端、或是用于任务执行的系统。下面将以服务器为执行主体为例,对本说明书提供的任务执行方法进行说明。
图1为本申请实施例提供的任务执行过程的示意图,具体包括以下步骤:
S100:监测所述线程池的线程占用情况。
在本说明书中,服务器可以对线程池中线程的占用情况进行监测。服务器可以根据任务的开始执行以及执行结束所伴随的线程的占用与释放,来监测该线程池中线程的占用情况,也可以根据任务执行时占用线程的时长变化,监测该线程池中线程的占用情况。
S102:当监测到所述线程占用情况出现变化时,根据变化后的线程占用情况,确定各任务类型对应的优先级。
当服务器监测线程池中线程的占用情况出现变化时,则可根据变化后的线程占用情况,确定各任务类型对应的优先级。其中,这里提到的任务类型可以是与服务器向用户提供的服务相对应的,不同的服务对应不同的任务类型。如,用户向服务器发起支付请求时,服务器根据支付请求所生成的任务则是属于支付类型的,而当用户向服务器发起订票请求时,服务器根据该订票请求而生成的任务则是属于票务类型的。
在本说明中,线程池中的各线程可以被不同任务类型的任务占用,而从另一个角度说,不同任务类型的任务在执行过程中,可以占用该线程池中的一部分线程。伴随着各任务的开始执行以及执行结束,不同任务类型的任务所占用的线程的数量都是动态变化的。
所以,服务器可以基于不同任务类型的任务当前所占用的线程的数量,来确定不同任务类型当前的优先级。由于不同任务类型的任务所占用的线程的数量是时刻变化的,所以,不同任务类型所对应的执行优先级也是动态变化的。
在本说明书中,服务器可以针对每个任务类型,确定出该任务类型的任务当前所占用的线程的数量,服务器可以根据确定出的该任务类型占用线程的数量,确定出当前该任务类型所对应的优先级。
例如,假设服务器监测到线程池中线程的占用情况出现变化时,确定出当前任务类型A的任务共占用了150个线程,则服务器可根据确定出的占用线程的数量150,确定出任务类型A当前所对应的优先级。
在本说明书中,一个任务类型的任务当前所占用的线程在数量上越多,优先级越低。也就是说,当一个任务类型的任务当前占用过多的线程时,服务器应从任务队列中调取其他占用线程较少的任务类型的任务,以平衡各任务类型的任务所占用的线程。因此,对于当前占用过多线程的一类任务,该任务类型当前对应的优先级应较低。
所以,上述通过该任务类型的任务当前占用的线程的数量,其实是与该任务类型当前对应的优先级成负相关的。即占用的线程的数量越多,优先级则也越低。
在本说明书中,服务器中可以设置一个计数器,用于记录各任务类型的任务占用的线程的数量。例如,对于一个任务类型来说,服务器开始执行该任务类型的一个任务时,该计数器即可将该任务类型的任务所占用的线程的数量加1,而当该任务类型的一个任务执行结束时,该计数器即可将该任务类型的任务所占用的线程的数量减1。服务器可以通过该计数器时刻记录各任务类型的任务占用线程的数量,继而通过计数器所记录的各任务类型的任务占用线程的数量,时刻确定出各任务类型所对应的优先级。
需要说明的是,在本说明书中,由于线程池中线程的数量有限,所以,服务器根据用户发起的服务请求生成任务后,可确定当前时刻该线程池中是否存在闲置的线程。当确定出各线程均已被占用时,则可将生成的任务暂时存储在任务队列中,等到该线程池中出现闲置的线程时,将生成的任务从该任务队列中调出,并通过该闲置的线程执行该任务。
而当线程池中存在闲置的线程,且任务队列中也未存储有任务时,则此时线程池中的线程处于充裕状态,服务器可以直接通过该线程池中的闲置线程,执行生成的任务。并且,在线程充裕的情况下,服务器也可不对各任务类型的任务所占用的线程的数量进行计数统计。等到该线程池的线程均被占用,且任务队列中存在任务时,开始确定各任务类型的任务占用线程的数量,并随着任务的开始执行以及执行结束,对记录的各任务类型的任务所占用的线程的数量进行实时更新。
S104:根据确定出的各任务类型对应的优先级,从任务队列中调取任务并执行。
服务器确定出各任务类型所对应的优先级后,可以确定出优先级最高的任务类型,并从任务队列中,调取该任务类型最先进入该任务队列的任务并执行。
在本说明书中,由于在一个任务执行结束时,将会释放该任务执行时所占用的线程,该线程将成为闲置的线程。因此,服务器从任务队列中调取出执行优先级最高的一类任务时,可以通过该闲置的线程,对调取出的任务进行执行。
需要说明的是,服务器从任务队列中调取优先级最高的任务类型的任务并执行可以有两层含义。
一、服务器确定出优先级最高的任务类型的任务存在于任务队列中,服务器则可以从该任务队列中调取该任务类型的任务并执行。这里提到的优先级最高的任务类型是指该任务类型相对于该线程池所对应的所有任务类型,优先级最高。
二、服务器确定出优先级最高的任务类型的任务并不存在于任务队列中,则服务器可以调取当前位列在任务队列中优先级最高的任务类型的任务并执行。这里提到的当前位列在任务队列中优先级最高的任务类型是针对该任务队列中存储的各任务而言的。即,服务器从任务队列中调取出的任务所对应的任务类型,是当前存储在任务队列的各任务中,任务类型的优先级最高的。
从上述方法中可以看出,由于服务器在监测到线程池中线程的占用情况出现变化时,则可以确定各任务类型所对应的优先级,并从任务队列中调取当前优先级最高的一类任务进行执行。这样一来,一些任务类型的任务即使初始占用了大量的线程,但由于这些任务类型的任务优先级较低,服务器也会将这些任务类型的任务执行结束后所释放的线程用于执行那些优先级较高的任务。这样随着时间的推移,各任务类型的任务所占用的线程将达到一个相对平衡的状态。
服务器无需再对每个任务类型分别分配一个线程池,从而有效的降低了服务器的运行负载。并且,线程池中出现大量闲置线程的情况也将极大的降低,因此不仅提高了任务执行时的资源利用率,也实现了任务执行的资源合理分配。
不仅如此,由于不同线程池可以为不完全相同的任务类型的任务提供执行所需的线程,这样即能够在一定程度上做到对各任务类型的任务执行过程中的资源隔离,从而有效的保障了各任务能够正常、稳定的执行。
需要说明的是,在本说明书中,在确定出各任务类型对应的优先级后,服务器也可以采用其他的方式,从任务队列中调取任务并执行。例如,假设服务器确定出三个任务类型当前对应的优先级后,可以确定出优先级位于前两个的任务类型,并从这两个任务类型中随机选择一个任务类型。服务器可从任务队列中调取所选任务类型的任务并执行。当然,服务器还可以通过其他的方式,根据确定出的各任务类型对应的优先级,从任务队列中调取任务并执行,在此就不详细举例说明了。
在上述步骤S102中,服务器在确定出一个任务类型对应的优先级时,也可以通过其他任务类型的任务所占用的线程的数量,来确定该任务类型对应的优先级。另外,服务器除了可以根据占用线程的数量,确定一个任务类型对应的优先级外,还可以通过其他的方式,确定一个任务类型对应的优先级。例如,服务器可以针对每个任务类型,确定该任务类型的任务占用线程的时长,进而根据确定出的各任务类型的任务占用线程的时长,确定出各任务类型对应的优先级。
再例如,由于不同服务的热度有所不同,相应的,不同任务类型的热度也有所不同。因此,服务器可以基于不同任务类型的热度以及不同任务类型的任务当前所占用的线程的数量,综合确定出各任务类型当前所对应的优先级。例如,对于每个任务类型来说,服务器可以根据该任务类型的热度和该任务类型的任务当前占用的线程的数量,以及这两者分别对应的预设权重,确定出该任务类型的优先级。当然,确定优先级的方式还可以有多种,在此就不一一举例说明了。
为了进一步的说明本说明书所提供的任务执行方法,下面将以一个实际的示例,来将整个任务执行的过程进行描述,如图2所示。
图2为本说明书提供的整个任务执行的过程示意图。
当服务器接收到用户发起的服务请求时,可以根据该服务请求,生成相应的任务。此时,服务器可以判断线程池中是否存在闲置的线程,当确定该线程池中的线程均已被占用时,则可将该任务存储在任务队列中进行等待。而当确定出线程池中存在闲置的线程、且任务队列中没有等待被执行的任务时,则可通过闲置的线程直接执行该任务。
服务器在执行各任务的过程中,可时刻监测线程池中线程的占用情况。当监测该线程池中线程的占用情况出现变化时,则确定出当前时刻,各任务类型的任务所占用的线程的数量,进而确定出各任务类型当前所对应的优先级。服务器可以进一步的确定出当前优先级最高的任务类型,并从任务队列中,调取出与该任务类型相同的任务并执行。其中,当任务队列中存在多个该任务类型(即优先级最高的任务类型)的任务时,则将先进入该任务队列的任务调出并执行。
在本说明书中,线程池可以设有多个,每个线程池可以对应至少一个任务队列,如图3所示。
图3为本说明书提供的服务器中设有多个线程池的示意图。
服务器中可以设置多个线程池,服务器根据用户发起的服务请求生成任务后,可以确定出与该任务的任务类型相对应的线程池(即能够为该任务类型的任务提供执行所需线程的线程池),并通过该线程池中闲置的线程执行该任务。而对于每个线程池来说,该线程池可以对应至少一个任务队列,用于存放暂时获取不到线程而需要等待的任务。服务器将对各线程池中的线程占用情况时刻进行监测,当监测到某一线程池的线程占用情况出现变化时,确定该线程池对应的各任务类型当前对应的优先级,并从中确定出优先级最高的任务类型。服务器可以从该线程池对应的任务队列中,调取当前优先级最高的任务类型的任务进行执行。
以上为本说明书的一个或多个实施例提供的任务执行方法,基于同样的思路,本说明书还提供任务执行的装置,如图4所示。
图4为本说明书提供的一种任务执行的装置示意图,具体包括:
监测模块401,监测所述线程池的线程占用情况;
确定模块402,当监测到所述线程占用情况出现变化时,根据变化后的线程占用情况,确定各任务类型对应的优先级;
执行模块403,根据确定出的各任务类型对应的优先级,从任务队列中调取任务并执行。
所述监测模块401,当通过所述线程池中的线程开始执行任务时,则确定所述线程占用情况出现变化;和/或当所述线程池中被占用的线程被释放时,确定所述线程占用情况出现变化。
所述确定模块402,针对每个任务类型,确定该任务类型的任务所占用的线程的数量;根据针对每个任务类型确定出的数量,确定各任务类型对应的优先级,其中,一种任务类型的任务占用的线程的数量越大,该任务类型对应的优先级越低。
所述任务队列中的任务是在所述线程池中的线程均被占用时,存储在所述任务队列中的。
所述执行模块403,从所述任务队列中调取优先级最高的任务类型对应的任务并执行。
所述执行模块403,从所述任务队列中确定优先级最高的任务类型所对应的任务;从确定出的任务中,调取最先进入所述任务队列的任务并执行。
不同线程池为不完全相同的任务类型的任务提供线程。
基于上述说明的任务执行的方法,本说明书还对应提供了一种任务执行的设备,如图5所示。该任务执行的设备包括一个或多个处理器及存储器,所述存储器存储有程序,并且被配置成由所述一个或多个处理器执行以下步骤:
监测所述线程池的线程占用情况;
当监测到所述线程占用情况出现变化时,根据变化后的线程占用情况,确定各任务类型对应的优先级;
根据确定出的各任务类型对应的优先级,从任务队列中调取任务并执行。
在本说明书的一个或多个实施例中,在监测到线程池中线程的占用情况出现变化时,可以根据变化后的线程占用情况,确定各任务类型对应的优先级,进而根据确定出的各任务类型对应的优先级,从任务队列中调取任务并执行。由于各任务在执行过程中时刻伴随着线程的占用与释放,所以,根据线程占用情况所确定出的各任务类型所对应的优先级是动态变化的。因此,可以基于动态变化的优先级,决定从任务队列中调取哪种任务类型的任务并执行。这样即可以根据动态变化的优先级有效的平衡各任务类型的任务所占用的资源,实现了对各项任务执行所需资源的合理分配。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable GateArray,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(RubyHardware Description Language)等,目前最普遍使用的是VHDL(Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本说明书的实施例可提供为方法、系统、或计算机程序产品。因此,本说明书可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本说明书可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书是参照根据本说明书一个或多个实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本说明书可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书的一个或多个实施例,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
以上所述仅为本说明书的一个或多个实施例而已,并不用于限制本申请。对于本领域技术人员来说,本说明书的一个或多个实施例可以有各种更改和变化。凡在本说明书的一个或多个实施例的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。