发明内容
发明人发现,在相关技术中,主进程负责执行任务,当主进程执行延时执行任务时会抢占中央处理器的资源,在此过程中,会造成其他进程无法正常进行。例如,在浏览器的应用场景中,主进程在任务执行完成后会将执行结果传给渲染进程,以使渲染进程根据主进程的任务执行结果对浏览器的页面进行渲染。当延时执行任务被主进程利用中央处理器的资源进行执行时,浏览器的渲染进程会一直处于堵塞状态,造成整个浏览器页面卡死的现象,导致页面无法进行任何操作。
本公开将延时执行任务逐条放进异步队列当中,使用异步队列的方式使得延时执行任务能够被主进程异步执行。例如在浏览器的应用场景中,主进程可以不等待延时执行任务的执行结束,继续执行任务队列中后续的任务并使用渲染进程根据后续任务的执行结果对页面进行渲染。延时执行任务的异步执行使得在不影响其他进程正常执行的同时,达到对延时执行任务的延时执行,解决了执行延时执行任务时造成的进程堵塞的问题。
根据本公开的一些实施例,提供一种任务队列的处理方法,包括:
将待处理的任务队列作为参数传入递归函数中;
针对所述任务队列中的每个任务,依次判断当前任务是否为延时执行任务;
如果所述当前任务不是延时执行任务,直接调用所述递归函数执行所述当前任务;
如果所述当前任务是延时执行任务,将所述延时执行任务添加到异步队列中,利用异步队列调用所述递归函数执行所述延时执行任务;
继续处理所述任务队列中的下一个任务,直到所述任务队列中的所有任务执行完毕。
在一些实施例中,直接调用所述递归函数执行所述当前任务包括:将所述当前任务及其索引号作为参数传入所述递归函数中,使得所述递归函数执行所述当前任务。
在一些实施例中,利用异步队列调用所述递归函数执行所述延时执行任务包括:将所述延时执行任务及其索引号作为参数传入所述异步队列调用的递归函数中,使得所述异步队列调用的递归函数执行所述延时执行任务。
在一些实施例中,将所述延时执行任务添加到异步队列中包括:利用超时调用函数将所述延时执行任务添加到异步队列中。
在一些实施例中,利用超时调用函数将所述延时执行任务添加到异步队列中包括:将所述异步队列调用的递归函数和延时参数作为参数传入所述超时调用函数,所述异步队列调用的递归函数的输入参数包括所述延时执行任务,以使得所述超时调用函数将所述延时执行任务添加到异步队列。
在一些实施例中,所述异步队列调用的递归函数的输入参数还包括所述延时执行任务的索引号。
在一些实施例中,所述超时调用函数包括setTimeout函数。
根据本公开的另一些实施例,提供一种任务队列的处理装置,包括:输入模块,被配置为将待处理的任务队列作为参数传入递归函数中;判断模块,被配置为针对所述任务队列中的每个任务,依次判断当前任务是否为延时执行任务;非延时任务处理模块,被配置为针对非延时执行任务,直接调用所述递归函数执行所述当前任务;延时任务处理模块,被配置为针对延时执行任务,将所述延时执行任务添加到异步队列中,利用异步队列调用所述递归函数执行所述延时执行任务;任务队列处理模块,被配置为触发所述判断模块、所述非延时任务处理模块和所述延时任务处理模块继续处理所述任务队列中的下一个任务,直到所述任务队列中的所有任务执行完毕。
根据本公开的又一些实施例,提供一种任务队列的处理装置,包括:存储器;以及耦接至所述存储器的处理器,所述处理器被配置为基于存储在所述存储器中的指令,执行任一实施例所述的任务队列的处理方法。
根据本公开的再一些实施例,提供一种非瞬时性计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现任一实施例所述的任务队列的处理方法。
具体实施方式
下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述。
图1示出根据本公开的一些实施例的任务队列的处理方法的流程示意图。该方法例如可以由任务队列的处理装置执行。
如图1所示,该实施例的方法包括步骤101-105。
在步骤101,将待处理的任务队列作为参数传入递归函数中。
其中,递归函数指的是能够直接或间接调用函数自身的一种函数,相应地,一个函数在自身的函数体内调用自身称为递归调用。任务队列中的任务需要在递归函数中执行。
其中,任务队列包含了一个或多个任务,执行任务队列也就是执行任务队列中的所有任务。在计算机的编程实现中,可以以命令的方式来表示任务,即执行每个任务也就是指执行每个任务所对应的命令。
为整个任务队列的所有任务一次性注册一个递归函数,可以达到只定义一次递归函数就可以实现整个任务队列中所有任务的执行,而且可以处理多个延时执行任务,代码量少且函数结构简单,从而易于实现且方便维护。
在步骤102,针对任务队列中的每个任务,依次判断当前任务是否为延时执行任务。
在执行完成后需要延时一段时间的任务称为延时执行任务。延时执行任务例如可以是按钮点击任务,例如点击一个按钮后,延时一段时间(例如可以是30ms),页面再跳转到相关业务平台的页面。
在一些实施例中,在递归函数的内部,依次处理任务队列中的每个任务,即针对任务队列中的每个任务,依次判断当前任务是否为延时执行任务,如果当前任务不是延时执行任务,则进入到非延时执行任务的处理步骤103进行处理;如果当前任务是延时执行任务,则进入到延时执行任务的处理步骤104进行处理。
在步骤103,如果当前任务不是延时执行任务,直接调用递归函数执行该非延时执行任务。
其中,直接调用递归函数执行非延时执行任务的一些实施例例如包括:将非延时执行任务及其索引号作为参数传入递归函数中,使得递归函数执行该非延时执行任务。
通过索引号可以标记当前执行的任务。在某一任务执行出错的情况下,可以根据索引号快速定位出错的任务,并可将程序快速准确地回滚到前一个已被正确执行的任务。
在步骤104,如果当前任务是延时执行任务,将延时执行任务添加到异步队列中,利用异步队列调用递归函数执行延时执行任务。
其中,将延时执行任务添加到异步队列中的一些实施例包括:利用超时调用函数(如setTimeout)将延时执行任务添加到异步队列中。
利用超时调用函数将延时执行任务添加到异步队列的一些实施例包括:将异步队列调用的递归函数和延时参数作为参数传入超时调用函数,异步队列调用的递归函数的输入参数包括延时执行任务,以使得超时调用函数将延时执行任务添加到异步队列。在一些实施例中,超时调用函数根据传入的延时参数的值对延时执行任务进行延时执行。此外,异步队列调用的递归函数的输入参数还包括延时执行任务的索引号。
利用异步队列调用递归函数执行延时执行任务的一些实施例包括:将延时执行任务及其索引号作为参数传入异步队列调用的递归函数中,使得异步队列调用的递归函数执行延时执行任务。
在步骤105,继续处理任务队列中的下一个任务,直到任务队列中的所有任务执行完毕。
依次逐条处理任务队列中的下一个任务,直到任务队列中的所有任务执行完毕,则该任务队列执行完毕。
上述实施例中,将延时执行任务逐条放进异步队列当中,使用异步队列的方式使得延时执行任务能够被主进程异步执行。例如在浏览器的应用场景中,主进程可以不等待延时执行任务的执行结束,同时执行任务队列中后续的任务并使用渲染进程根据后续任务的执行结果对页面进行渲染。延时执行任务的异步执行使得在不影响其他进程正常执行的同时,达到对延时执行任务的延时执行,解决了执行延时执行任务时造成的进程堵塞的问题。此外,通过索引号标记当前执行的任务。在某一任务执行出错的情况下,可以根据索引号快速定位出错的任务,并可将程序快速准确地回滚到前一个已被正确执行的任务。
图2示出根据本公开的另一些实施例的任务队列的处理方法的流程示意图。该方法例如可以由任务队列的处理装置执行。如图2所示,该实施例的方法包括步骤201-207。下面将对各个步骤进行详细描述。
首先,在初始化阶段,为索引号设置一个初始化值(例如可以设置为0),定义一个数据集合并将其初始化为任务队列中的各个任务。然后,将任务队列存储到数据集合中。
在步骤201,将存储着任务队列的数据集合通过数据传递的方式传入到递归函数中。
在步骤202,将索引号的值加1。
在步骤203,判断任务队列是否执行完毕,如果判断结果为是,即任务队列中的所有任务执行完毕,则进入步骤204。如果判断结果为否,即任务队列没有执行完毕,则进入步骤205。
在步骤204,任务队列执行完毕,返回任务队列执行成功。
在步骤205,任务队列没有执行完毕,判断任务队列中的当前任务是否需要延时,如果判断结果为否,即任务队列中的当前任务不需要延时(即当前任务为非延时执行任务),则进入步骤206,如果判断结果为是,即任务队列中的当前任务需要延时(即该任务为延时执行任务),则进入步骤207。
在步骤206,直接调用递归函数执行非延时执行任务。
在步骤207,在异步队列中调用递归函数来执行该延时执行任务。
接着,重复执行步骤202-207,直到执行到步骤204,任务队列的所有任务执行完毕,返回任务队列执行成功。
假设任务队列中有A、B、C、D四个任务,其中B、D任务需要被延时执行,即B、D任务为延时执行任务,在一些实施例中,应用递归函数实现B、D延时执行任务的异步处理的伪代码如下所示:
Evens表示存储着任务队列的数据集合,包含有A、B、C、D四个任务,其中,B延时执行任务的延时时间为200毫秒,参数标记为Sleep:200,D延时执行任务的延时时间为300毫秒,参数标记为Sleep:300。
Recursive表示递归函数,数据集合Evens和索引号index(初始值设置为0)作为两个参数传入到递归函数中,在递归函数的内部对任务队列中的各个任务的执行处理。
在递归函数内部,首先将前一任务的索引号index加1,即用语句index++表示,将index++的值作为该延时执行任务的索引号,
然后,利用语句if(index≤Evens.length)判断任务队列是否执行完毕,也就是判断当前索引号是否小于等于数据集合中任务的最大索引号,index≤Evens.length表示当前任务的索引号小于等于数据集合的长度,即该索引号对应的任务存在于数据集合中,也就是指数据集合中的任务队列没有被执行完毕,反之,如果index>Evens.length,则表示当前任务的索引号大于数据集合的长度,即该索引号对应的任务不在数据集合中,也就是指数据集合中的任务队列已经被执行完毕。
使用语句If(evens.Sleep!=null)判断当前待执行的任务是否需要延时,evens.Sleep!=null表示当前执行的任务的Sleep参数不为空,即当前执行的任务为延时执行任务,evens.Sleep=null表示当前执行的任务的Sleep参数为空,即当前执行的任务为非延时执行任务。
对于延时执行任务,则使用setTimeout函数通过将当前延时执行任务的延时参数(例如用evens.Sleep表示),以及异步队列调用的递归函数(例如用Recursive()表示)作为setTimeout函数的参数传入setTimeout函数,使用异步队列来调用递归函数执行该延时执行任务。其中,异步队列调用的递归函数的参数包括该延时执行任务(例如用evens表示)及其索引号(例如用index表示),即异步队列调用的递归函数例如可以表示为Recursive(evens,index)。
对于非延时执行任务,则直接调用递归函数执行该任务,直接调用的递归函数的参数包括该任务(例如用evens表示)及其索引号(例如用index表示),直接调用的递归函数可以表示为Recursive(evens,index++)。
图3示出根据本公开的一些实施例的任务队列的处理装置的示意图。
如图3所示,该实施例的任务队列的处理装置300例如可以包括:输入模块301、判断模块302、非延时任务处理模块303、延时任务处理模块304、任务队列处理模块305。
其中,输入模块301,被配置为将待处理的任务队列作为参数传入递归函数中。
判断模块302,被配置为针对任务队列中的每个任务,依次判断当前任务是否为延时执行任务。
非延时任务处理模块303,被配置为针对非延时执行任务,直接调用递归函数执行当前任务。
其中,直接调用递归函数执行当前任务例如包括:将当前任务及其索引号作为参数传入递归函数中,使得递归函数执行当前任务。
延时任务处理模块304,被配置为针对延时执行任务,将延时执行任务添加到异步队列中,利用异步队列调用递归函数执行延时执行任务。
其中,延时任务处理模块304中的将延时执行任务添加到异步队列中包括:利用超时调用函数(例如包括setTimeout函数)将延时执行任务添加到异步队列中。在一些实施例中,利用超时调用函数将延时执行任务添加到异步队列中例如包括:将异步队列调用的递归函数和延时参数作为参数传入超时调用函数,异步队列调用的递归函数的输入参数包括延时执行任务,以使得超时调用函数将延时执行任务添加到异步队列。此外,异步队列调用的递归函数的输入参数还包括延时执行任务的索引号。
其中,延时任务处理模块304中的利用异步队列调用递归函数执行延时执行任务例如包括:将延时执行任务及其索引号作为参数传入异步队列调用的递归函数中,使得异步队列调用的递归函数执行延时执行任务。
任务队列处理模块305,被配置为触发判断模块302、非延时任务处理模块303和延时任务处理模块304继续处理任务队列中的下一个任务,直到任务队列中的所有任务执行完毕。
图4示出根据本公开的另一些实施例的任务队列的处理装置的示意图。
如图4所示,该实施例的任务队列的处理装置400包括:存储器401以及耦接至该存储器401的处理器402,处理器402被配置为基于存储在存储器401中的指令,执行前述任意一些实施例中的任务队列的处理方法。
其中,存储器401例如可以包括系统存储器、固定非易失性存储介质等。系统存储器例如存储有操作系统、应用程序、引导装载程序(Boot Loader)以及其他程序等。
任务队列的处理装置400还可以包括输入输出接口403、网络接口404、存储接口405等。这些接口403,404,405以及存储器401和处理器402之间例如可以通过总线406连接。其中,输入输出接口403为显示器、鼠标、键盘、触摸屏等输入输出设备提供连接接口。网络接口404为各种联网设备提供连接接口。存储接口405为SD卡、U盘等外置存储设备提供连接接口。
本领域内的技术人员应当明白,本公开的实施例可提供为方法、系统、或计算机程序产品。因此,本公开可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本公开可采用在一个或多个其中包含有计算机程序代码的计算机非瞬时性可读存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本公开是参照根据本公开实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解为可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述仅为本公开的较佳实施例,并不用以限制本公开,凡在本公开的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本公开的保护范围之内。