一种任务处理方法、装置及电子设备
技术领域
本发明涉及软件技术领域,特别涉及一种任务处理方法、装置及电子设备。
背景技术
机构能力检测系统Fincapacity,用于通过生产环境构建真实的机构交易,可控地模拟高压力并发场景下,对对端系统的性能进行诊断和评估。机构能力检测系统对检测任务的可控制、可调节性能有非常严苛的要求,如果出现问题,可能会导致被检测系统(如支付系统、银行系统)宕机,造成严重的经济损失。
现有的任务运行通常采用异步并行的方式来实现。由于异步并行需要通过回调函数进行返回值的处理,在复杂情况下会造成嵌套过深的问题,无法对异步并行任务的执行进行有效的控制和调节,无法满足机构能力检测系统的需求。
发明内容
本申请实施例提供一种任务处理的方法、装置及电子设备,用于实现检测任务的可控制性和可调节性,提高机构能力检测系统的可靠性。
本申请的第一方面,提供一种任务处理方法,所述方法包括:
将目标任务置入延时队列中;
将任务产生器的内置任务初始化为所述延时队列;
通过所述任务产生器检测所述延时队列是否出队所述目标任务;
当所述延时队列出队所述目标任务时,通过所述任务产生器输出所述目标任务到线程池对应的任务队列中;
通过所述线程池并发执行所述任务队列中的所述目标任务。
可选的,所述将目标任务置入所述延时队列中,具体为:
根据目标任务的每秒查询率QPS,将目标任务置入所述延时队列中。
可选的,所述根据目标任务的每秒查询率QPS,将目标任务置入所述延时队列中,包括:
根据目标任务的每秒查询率QPS,计算获得所述目标任务的运行时间;
按照所述运行时间设置所述目标任务的延迟时间;
按照所述延迟时间,将目标任务置入所述延时队列中。
可选的,所述通过所述任务产生器检测所述延时队列是否出队所述目标任务,包括:
通过任务产生器的协程迭代检测所述延时队列中是否出队所述目标任务;
当所述延时队列出队所述目标任务时,通过所述任务产生器输出所述目标任务到线程池对应的任务队列中,包括:
当所述延时队列出队所述目标任务时,通过任务产生器的所述协程通知所述任务产生器的调用线程输出所述目标任务到所述任务队列中。
可选的,所述方法还包括:
当所述协程通知所述调用线程输出所述目标任务到所述任务队列时,向所述调用线程返回用于表征是否具有下一个任务的参数;
若所述参数表明具有下一个任务时,所述调用线程在输出所述目标任务到所述任务队列中之后,等待执行下一个任务的输出。
可选的,所述通过所述任务产生器输出所述目标任务到线程池对应的任务队列中,具体为:
通过任务产生器引用所述任务队列,获得所述任务队列的地址,输出所述目标任务到所述地址中。
可选的,在所述通过所述线程池并发执行所述任务队列中的任务之前,所述方法还包括:
将所述任务队列放入所述任务产生器中,启动所述线程池,使得所述线程池调用所述任务队列时运行所述任务产生器。
本申请的第二方面,提供一种任务处理装置,所述装置包括:
置入单元,用于将目标任务置入延时队列中;
初始单元,用于将任务产生器的内置任务初始化为所述延时队列;
检测单元,用于通过所述任务产生器检测所述延时队列是否出队所述目标任务;
输出单元,用于当所述延时队列出队所述目标任务时,通过所述任务产生器输出所述目标任务到线程池对应的任务队列中;
执行单元,用于通过所述线程池并发执行所述任务队列中的所述目标任务。
可选的,所述置入单元用于:根据目标任务的每秒查询率QPS,将目标任务置入所述延时队列中。
可选的,所述置入单元,包括:
计算子单元,用于根据目标任务的每秒查询率QPS,计算获得所述目标任务的运行时间;
置入子单元,用于按照所述运行时间设置所述目标任务的延迟时间;按照所述延迟时间,将目标任务置入所述延时队列中。
可选的,所述检测单元具体用于:通过任务产生器的协程迭代检测所述延时队列中是否出队所述目标任务;
所述输出单元具体用于:当所述延时队列出队所述目标任务时,通过任务产生器的所述协程通知所述任务产生器的调用线程输出所述目标任务到所述任务队列中。
可选的,所述装置还包括:
返回单元,用于当所述协程通知所述调用线程输出所述目标任务到所述任务队列时,向所述调用线程返回用于表征是否具有下一个任务的参数;
若所述参数表明具有下一个任务时,所述调用线程在输出所述目标任务到所述任务队列中之后,等待执行下一个任务的输出。
可选的,所述输出单元用于:通过任务产生器引用所述任务队列,获得所述任务队列的地址,输出所述目标任务到所述地址中。
可选的,所述装置还包括:
启动单元,用于在所述通过所述线程池并发执行所述任务队列中的任务之前,将所述任务队列放入所述任务产生器中,启动所述线程池,使得所述线程池调用所述任务队列时运行所述任务产生器。
本申请的第三方面,提供一种电子设备,包括有存储器,以及一个或者一个以上的程序,其中一个或者一个以上程序存储于存储器中,且经配置以由一个或者一个以上处理器执行所述一个或者一个以上程序包含用于进行以下操作的指令:
将目标任务置入延时队列中;
将所述任务产生器的内置任务初始化为所述延时队列;
通过所述任务产生器检测所述延时队列是否出队所述目标任务;
当所述延时队列出队所述目标任务时,通过所述任务产生器输出所述目标任务到线程池对应的任务队列中;
通过所述线程池并发执行所述任务队列中的所述目标任务。
本申请实施例中的上述一个或多个技术方案,至少具有如下技术效果:
将目标任务置入延时队列中;将任务产生器的内置任务初始化为延时队列;通过任务产生器判断延时队列是否出队所述目标任务,当延时队列出队所述目标任务时,通过任务产生器输出目标任务到线程池对应的任务队列中;通过所述线程池并发执行所述任务队列中的所述目标任务,即通过延时队列与任务产生器的配合,使得目标任务进入任务队列的时间受到延时队列出队目标任务的时间限制,进而限制目标任务被运行的时间,为此可以通过延时队列来有效控制和调整目标任务的运行,进而实现检测任务的可控制性和可调节性,提高机构能力检测系统的可靠性。
附图说明
图1为本申请实施例提供的一种任务处理方法的流程图;
图2为本申请实施例提供的一种任务处理装置的示意图;
图3为本申请实施例提供的一种用于实现任务处理方法的电子设备的示意图。
具体实施方式
下面结合附图对本申请实施例技术方案的主要实现原理、具体实施方式及其对应能够达到的有益效果进行详细的阐述。
技术术语说明:
Generator(发生器):在计算机科学中,Generator是可用于控制循环迭代行为的程序。Generator能实现在单个调用上下文的同时实现生产者和消费者的协同。
Queue(队列):程序语言中一种数据结构,具有放入元素“先进先出”的访问模式,也具备List列表的所有功能。
DelayQueue(延迟队列):Java程序语言中,采用一种阻塞队列BlockingQueue来实现的,通过获取入队列元素的延迟时间Delay来判断元素在队列中的顺序,并按照延迟时间Delay出队延迟队列中的元素,延迟时间较短的元素,优先出队列。
ThreadPool(线程池):一种多线程处理形式,主要进行线程对象创建后的循环复用。
方法实施例
请参考图1,本申请实施例提供一种任务处理方法,应用于java中,可以对机构能力检测系统中的检测任务进行处理,也可以对电子设备中限时执行任务进行处理。该任务处理方法包括:
S11:将目标任务置入延时队列中。
其中,可以根据目标任务的每秒查询率(Query Per Second,QPS),将目标任务置入延时队列中。目标任务的QPS由系统或电子设备在创建目标任务时设置完成,可以由系统或电子设备进行实时调节。具体的,可以根据待执行的目标任务的数量,以及要完成的时间来进行设定,例如:假设n个目标任务要在t分钟内完成,可以将QPS设置为n/(t*60)。
将目标任务置入延时队列时,可以先根据目标任务的每秒查询率QPS,计算获得目标任务的运行时间;然后,按照目标任务的运行时间设置目标任务的延迟时间;进而,按照目标任务的延迟时间,将目标任务置入延时队列中。例如:假设目标任务的QPS为n/(t*60),那么每个目标任务的运行时间则为(t*60)/n,相应的相邻目标任务之间的出队时间间隔为(t*60)/n;若第一个目标任务置入延时队列,其延迟时间可以设置为0;第二个目标任务置入延时队列,其延迟时间设置为1*(t*60)/n;第三个目标任务置入延时队列,其延迟时间设置为2*(t*60)/n,以此类推。延迟队列被调后,延迟队列会在延迟时间到达时,出队(弹出)目标任务。
S12:将任务产生器的内置任务初始化为延时队列。
任务产生器Task Generator即用于产生任务的Generator。将任务产生器的内置任务初始化为延时队列的方式可以为:当任务产生器初始化时,在内存中由任务产生器的内置任务引用延迟队列的句柄,例如:假设任务产生器的内置任务为this.tasks,将由任务产生器的内置任务引用延时队列DelayQueue的代码如下:
TaskGenerator(List tasks){
this.tasks=new DelayQueue(tasks);
}
S13:通过所述任务产生器检测所述延时队列是否出队所述目标任务。
具体的,任务产生器的协程会迭代检测延时队列中是否出队目标任务。当检测出延时队列出队目标任务时,进入下一步S14。当检测出延时队列未出队目标任务时,任务产生器中用于输出目标任务的调用线程处于等待状态。
S14:当所述延时队列出队所述目标任务时,通过所述任务产生器输出所述目标任务到线程池对应的任务队列中。
当任务产生器的协程检测出延时队列出队目标任务时,由协程通知任务产生器的调用线程next()输出目标任务。例如:假设任务队列为taskQueue,输出目标任务到任务队列可以通过如下伪代码实现:
其中,任务产生器的协程采用同步队列SynchronousQueue实现。同步队列SynchronousQueue只能一个线程拿,一个线程取。协程内部还设置有处理函数Handler。协程通过yield方法调用协程内的处理函数handler,将目标任务交给处理函数Handler处理,如:
当协程内部的Handler被调用时,说明延时队列DelayQueue有一个目标任务出队,此时协程内部的数据采集器Collector会获得出队的目标任务,将这个目标任务放入同步队列,如:
当同步队列中放入一个目标任务时,协程通知调用线程进行迭代。调用线程next()获取同步队列中的目标任务。调用线程next()进一步将获取到的目标任务通过循环遍历的方式迭代输出到任务队列中,实现目标任务的消费。
当协程通知调用线程输出目标任务到任务队列时,还会向调用线程返回用于表征是否具有下一个任务的参数。若返回的参数表明具有下一个任务时,调用线程在输出目标任务到任务队列中之后,等待执行下一个任务的输出,即调用线程会等待协程返回下一个任务。当返回的参数表明不具有下一个任务时,返回参数为空,调用线程迭代终止,任务产生器Task Generator的本次运行终止。
S15:通过所述线程池并发执行任务队列中的目标任务。
具体实施过程中,在通过线程池并发执行任务队列中的目标任务之前,可以将任务队列放入任务产生器中,再启动线程池。线程池启动后会调用任务队列,而任务队列在任务产生器中,进而使得线程池调用任务队列时会首先运行任务产生器。任务产生器的运行输出目标任务到任务队列中,同步触发线程池运行目标任务。
在S14通过任务产生器输出目标任务到线程池对应的任务队列之前,本申请还对线程池和任务队列进行初始化,保证目标任务的运行不受其它任务的影响。尤其当目标任务为机构能力检测系统的检测任务时,初始化线程池和任务队列后,将检测任务输出到任务队列,使得检测任务的运行不受其它任务的影响,能够提高机构能力检测系统检测时的准确性。
上述实施例采用Generator的方式来传递目标任务,通过协程和线程控制目标任务有序的传递到线程池的任务队列中,同时利用Generator中的next方法分阶段执行任务产生器中的任务,利用Generator中的yield协程暂停执行以实现Generator分阶段运行,这样就不用将各个目标任务层层嵌套,简化编程复杂度,大幅提高任务处理性能,使得目标任务的处理平稳可靠,如果目标任务为对银行机构的进行检测的检测任务,那么可以保证检测过程平稳可靠。
装置实施例
基于上述方法实施例,本申请还对应提供一种任务处理装置,请参考图2,该装置包括:
置入单元21,用于将目标任务置入延时队列中;
初始单元22,用于将任务产生器的内置任务初始化为所述延时队列;
检测单元23,用于通过所述任务产生器检测所述延时队列是否出队所述目标任务;
输出单元24,用于当所述延时队列出队所述目标任务时,通过所述任务产生器输出所述目标任务到线程池对应的任务队列中;
执行单元25,用于通过所述线程池并发执行所述任务队列中的所述目标任务。
作为一种可选的实施方式,所述置入单元21用于:根据目标任务的每秒查询率QPS,将目标任务置入所述延时队列中。所述置入单元21,包括:计算子单元和置入子单元。计算子单元用于根据目标任务的每秒查询率QPS,计算获得所述目标任务的运行时间。置入子单元用于按照所述运行时间设置所述目标任务的延迟时间;按照所述延迟时间,将目标任务置入所述延时队列中。
作为一种可选的实施方式,所述检测单元23具体用于:通过任务产生器的协程迭代检测所述延时队列中是否出队所述目标任务。所述输出单元24具体用于:当所述延时队列出队所述目标任务时,通过任务产生器的所述协程通知所述任务产生器的调用线程输出所述目标任务到所述任务队列中。
作为一种可选的实施方式,所述装置还可以包括:返回单元,用于当所述协程通知所述调用线程输出所述目标任务到所述任务队列时,向所述调用线程返回用于表征是否具有下一个任务的参数;若所述参数表明具有下一个任务时,所述调用线程在输出所述目标任务到所述任务队列中之后,等待执行下一个任务的输出。
作为一种可选的实施方式,所述置入单元21用于:通过任务产生器引用所述任务队列,获得所述任务队列的地址,输出所述目标任务到所述地址中。
作为一种可选的实施方式,所述装置还可以包括:启动单元,用于在所述通过所述线程池并发执行所述任务队列中的任务之前,将所述任务队列放入所述任务产生器中,启动所述线程池,使得所述线程池调用所述任务队列时运行所述任务产生器。
关于上述实施例中的装置,其中各个单元执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
设备实施例
请参考图3,是根据一示例性实施例示出的一种用于实现任务处理的电子设备800的框图。例如,电子设备800可以是移动电话,计算机,数字广播终端,消息收发设备,游戏控制台,平板设备,医疗设备,健身设备,个人数字助理等。
电子设备800可以包括以下一个或多个组件:处理组件802,存储器804,电源组件806,输入/输出(I/O)的接口808。
处理组件802通常控制电子设备800的整体操作,诸如与显示、数据通信、记录操作相关联的操作。处理组件802可以包括一个或多个处理器820来执行指令,以完成上述的方法的全部或部分步骤。
存储器804被配置为存储各种类型的数据以支持在设备800的操作。这些数据的示例包括用于在电子设备800上操作的任何应用程序或方法的指令,联系人数据,电话簿数据,消息,图片,视频等。存储器804可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。
电源组件806为电子设备800的各种组件提供电力。电源组件806可以包括电源管理系统,一个或多个电源,及其他与为电子设备800生成、管理和分配电力相关联的组件。
I/O接口808为处理组件802和外围接口模块之间提供接口,上述外围接口模块可以是键盘,点击轮,按钮等。这些按钮可包括但不限于:主页按钮、音量按钮、启动按钮和锁定按钮。
在示例性实施例中,电子设备800可以被一个或多个应用专用集成电路(ASIC)、数字信号处理器(DSP)、数字信号处理设备(DSPD)、可编程逻辑器件(PLD)、现场可编程门阵列(FPGA)、控制器、微控制器、微处理器或其他电子元件实现,用于执行上述方法。
在示例性实施例中,还提供了一种包括指令的非临时性计算机可读存储介质,例如包括指令的存储器804,上述指令可由电子设备800的处理器820执行以完成上述方法。例如,所述非临时性计算机可读存储介质可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等。
一种非临时性计算机可读存储介质,当所述存储介质中的指令由移动终端的处理器执行时,使得移动终端能够执行一种任务处理方法,所述方法包括:将目标任务置入延时队列中;将所述任务产生器的内置任务初始化为所述延时队列;通过所述任务产生器检测所述延时队列是否出队所述目标任务;当所述延时队列出队所述目标任务时,通过所述任务产生器输出所述目标任务到线程池对应的任务队列中;通过所述线程池并发执行所述任务队列中的所述目标任务。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本发明的其它实施方案。本申请旨在涵盖本发明的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本发明的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本发明的真正范围和精神由下面的权利要求指出。
应当理解的是,本发明并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本发明的范围仅由所附的权利要求来限制
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。