一种代码执行方法、装置及计算机可读存储介质与流程

文档序号:20874560发布日期:2020-05-26 16:18阅读:125来源:国知局
一种代码执行方法、装置及计算机可读存储介质与流程

本文涉及计算机技术,尤指一种代码执行方法、装置及计算机可读存储介质。



背景技术:

多线程技术是能够同时处理进程内多个逻辑代码块的技术。

相关技术中,在应用多线程并行执行代码块的过程中,需要编写补充代码(例如实现执行结果存储的代码和实现多线程的代码)以辅助代码块的执行。

然而,由于这种方法的补充代码完全依靠于程序员的即时编写,因此十分耗费人力资源成本,并且使得代码执行效率低下。



技术实现要素:

本申请提供了一种代码执行方法、装置及计算机可读存储介质,能够节省人力资源成本,并且提高代码执行效率。

本申请提供了一种代码执行方法,包括:

通过预先定义的接口获取若干个待执行的目标代码块,并将获得的目标代码块封装在预先构建的通用对象中,以得到若干个任务对象;其中,所述通用对象包含有辅助所述目标代码块执行的补充代码,一个所述目标代码块封装在一个所述通用对象中;

利用若干个线程并行执行若干个任务对象以得到若干个执行结果;

将获得的执行结果返回给所述目标代码块的提供方。

所述将获得的目标代码块封装在预先构建的通用对象中,包括:

将所述目标代码块的内容写入所述通用对象的call方法中实现所述目标代码块封装在所述通用对象中。

所述利用若干个线程并行执行若干个任务对象以得到若干个执行结果,包括:

利用若干个线程按照单例设计模式对所述任务对象中的call方法进行包装,得到若干个线程对象;

并行执行获得的若干个线程对象以得到若干个执行结果。

在所述利用若干个线程并行执行若干个任务对象以得到若干个执行结果的过程中,当利用第一线程执行第一任务对象发生已知执行异常情况,所述第一线程对应的执行结果为第一结果值;其中,所述第一结果值为预先确定的用于表示已知执行异常的结果值。

在所述利用若干个线程并行执行若干个任务对象以得到若干个执行结果的过程中,当利用第二线程执行第二任务对象发生未知执行异常情况,还包括:

再次利用所述第二线程执行所述第二任务对象,直到不再发生未知执行异常情况或者重复执行次数到达预设次数;

当利用所述第二线程执行所述第二任务对象发生未知执行异常情况且重复执行次数到达所述预设次数,所述第二线程对应的执行结果为第二结果值;其中,所述第二结果值为预先确定的用于表示未知执行异常的结果值。

在所述利用若干个线程并行执行若干个任务对象以得到若干个执行结果的过程中,当利用第三线程执行第三任务对象发生执行中断情况,还包括:

停止所述第三线程与未执行完成的其他线程的执行过程,并获取执行日志返回给所述目标代码块的提供方;

所述第三线程与未执行完成的其他线程对应的执行结果为第三结果值,其中,所述第三结果值为预先确定的用于表示执行中断的结果值。

所述线程的个数为所述服务器的中央处理器cpu核心数的预设倍数。

本申请还提供了一种服务器,包括:

预处理模块,用于通过预先定义的接口获取若干个待执行的目标代码块,并将获得的目标代码块封装在预先构建的通用对象中,以得到若干个任务对象;其中,所述通用对象包含有辅助所述目标代码块执行的补充代码,一个所述目标代码块封装在一个所述通用对象中;

执行模块,用于利用若干个线程并行执行若干个任务对象以得到若干个执行结果;

反馈模块,用于将获得的执行结果返回给所述目标代码块的提供方。

本申请还提供了一种代码执行装置,包括:处理器和存储器,其中,存储器中存储有以下可被处理器执行的命令:

通过预先定义的接口获取若干个待执行的目标代码块,并将获得的目标代码块封装在预先构建的通用对象中,以得到若干个任务对象;其中,所述通用对象包含有辅助所述目标代码块执行的补充代码;

利用若干个线程并行执行若干个任务对象以得到若干个执行结果;

将获得的执行结果返回给所述目标代码块的提供方。

10.一种计算机可读存储介质,其特征在于,所述存储介质上存储有计算机可执行命令,所述计算机可执行命令用于执行以下步骤:

通过预先定义的接口获取若干个待执行的目标代码块,并将获得的目标代码块封装在预先构建的通用对象中,以得到若干个任务对象;其中,所述通用对象包含有辅助所述目标代码块执行的补充代码,一个所述目标代码块封装在一个所述通用对象中;

利用若干个线程并行执行若干个任务对象以得到若干个执行结果;

将获得的执行结果返回给所述目标代码块的提供方。

与相关技术相比,本申请包括:服务器通过预先定义的接口获取若干个待执行的目标代码块,并将获得的目标代码块封装在预先构建的通用对象中,以得到若干个任务对象;其中,所述通用对象包含有辅助所述目标代码块执行的补充代码,一个所述目标代码块封装在一个所述通用对象中;利用若干个线程并行执行若干个任务对象以得到若干个执行结果;将获得的执行结果返回给所述目标代码块的提供方。由于预先构建了包含有辅助所述目标代码块执行的补充代码的通用对象,当获得了待执行的目标代码块后将其封装在通用对象中即能得到可以被执行的任务对象,因此避免了补充代码的即时编写,从而极大程度地节省了人力资源成本,并且提高了代码执行效率。

本申请的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本申请而了解。本申请的目的和其他优点可通过在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。

附图说明

附图用来提供对本申请技术方案的理解,并且构成说明书的一部分,与本申请的实施例一起用于解释本申请的技术方案,并不构成对本申请技术方案的限制。

图1为本申请实施例提供的一种代码执行方法的流程示意图;

图2为本申请实施例提供的另一种代码执行方法的流程示意图;

图3为本申请实施例提供的一种asyncmission异步任务执行服务的流程;

图4为本申请实施例提供的一种服务器的结构示意图。

具体实施方式

本申请描述了多个实施例,但是该描述是示例性的,而不是限制性的,并且对于本领域的普通技术人员来说显而易见的是,在本申请所描述的实施例包含的范围内可以有更多的实施例和实现方案。尽管在附图中示出了许多可能的特征组合,并在具体实施方式中进行了讨论,但是所公开的特征的许多其它组合方式也是可能的。除非特意加以限制的情况以外,任何实施例的任何特征或元件可以与任何其它实施例中的任何其他特征或元件结合使用,或可以替代任何其它实施例中的任何其他特征或元件。

本申请包括并设想了与本领域普通技术人员已知的特征和元件的组合。本申请已经公开的实施例、特征和元件也可以与任何常规特征或元件组合,以形成由权利要求限定的独特的发明方案。任何实施例的任何特征或元件也可以与来自其它发明方案的特征或元件组合,以形成另一个由权利要求限定的独特的发明方案。因此,应当理解,在本申请中示出和/或讨论的任何特征可以单独地或以任何适当的组合来实现。因此,除了根据所附权利要求及其等同替换所做的限制以外,实施例不受其它限制。此外,可以在所附权利要求的保护范围内进行各种修改和改变。

此外,在描述具有代表性的实施例时,说明书可能已经将方法和/或过程呈现为特定的步骤序列。然而,在该方法或过程不依赖于本文所述步骤的特定顺序的程度上,该方法或过程不应限于所述的特定顺序的步骤。如本领域普通技术人员将理解的,其它的步骤顺序也是可能的。因此,说明书中阐述的步骤的特定顺序不应被解释为对权利要求的限制。此外,针对该方法和/或过程的权利要求不应限于按照所写顺序执行它们的步骤,本领域技术人员可以容易地理解,这些顺序可以变化,并且仍然保持在本申请实施例的精神和范围内。

本申请实施例提供一种代码执行方法,如图1所示,包括:

步骤101、服务器通过预先定义的接口获取若干个待执行的目标代码块,并将获得的目标代码块封装在预先构建的通用对象中,以得到若干个任务对象;其中,通用对象包含有辅助目标代码块执行的补充代码,一个目标代码块封装在一个通用对象中。

在一种示例性实例中,服务器通过预先定义的接口获取若干个待执行的目标代码块之前,还包括:

通过预先定义的另一接口获取来自目标代码块提供方的代码执行指令,即逻辑调用命令开始执行后续传入的代码块。

在一种示例性实例中,由于获得的若干个待执行的目标代码块需要并行执行,所以获得的若干个待执行的目标代码块可以组成一个代码块数组。

在一种示例性实例中,将获得的目标代码块封装在预先构建的通用对象中,包括:

当代码块使用的语言为java时,将目标代码块的内容写入通用对象的call方法中实现目标代码块封装在通用对象中。

在一种示例性实例中,预先定义一个接口asyncmission以用于让用户实现一个call方法,该方法的实现就目标代码块的内容,不同的查询或计算或其他逻辑代码就放在这个方法里面,该方法同时需要遵循一个规范,就是代码执行结果要在call方法里面返回,其中,asyncmission创建时可以指定返回结果的数据类型泛型。

步骤102、利用若干个线程并行执行若干个任务对象以得到若干个执行结果。

在一种示例性实例中,利用若干个线程并行执行若干个任务对象以得到若干个执行结果,包括:

利用若干个线程按照单例设计模式对任务对象中的call方法进行包装,得到若干个线程对象;

并行执行获得的若干个线程对象以得到若干个执行结果。

在一种示例性实例中,由于涉及到多线程问题,有可能出现并发获取同一个任务对象的情况,所以按照单例设计模式来进行任务对象的执行以保证同一个任务对象只由一个线程执行。

在一种示例性实例中,利用若干个线程并行执行若干个任务对象以得到若干个执行结果的过程中,当利用第一线程执行第一任务对象发生已知执行异常情况,第一线程对应的执行结果为第一结果值;其中,第一结果值为预先确定的用于表示已知执行异常的结果值。

在一种示例性实例中,在利用若干个线程并行执行若干个任务对象以得到若干个执行结果的过程中,当利用第二线程执行第二任务对象发生未知执行异常情况,还包括:

再次利用第二线程执行第二任务对象,直到不再发生未知执行异常情况或者重复执行次数到达预设次数。

当利用第二线程执行第二任务对象发生未知执行异常情况且重复执行次数到达预设次数,第二线程对应的执行结果为第二结果值;其中,第二结果值为预先确定的用于表示未知执行异常的结果值。

在一种示例性实例中,在利用若干个线程并行执行若干个任务对象以得到若干个执行结果的过程中,当利用第三线程执行第三任务对象发生执行中断情况,还包括:

停止第三线程与未执行完成的其他线程的执行过程,并获取执行日志返回给目标代码块的提供方。

第三线程与未执行完成的其他线程对应的执行结果为第三结果值,其中,第三结果值为预先确定的用于表示执行中断的结果值。

在一种示例性实例中,第一线程、第二线程、第三线程中的“第一”、“第二”和“第三”并不用于限定线程的顺序和数量,只是为了表示若干个线程中可能存在的三种线程,同样,第一任务对象、第二任务对象和第三任务对象中的“第一”、“第二”和“第三”也不用于限定任务对象的顺序和数量,只是为了若干个任务对象中可能存在的三种任务对象。

步骤103、将获得的执行结果返回给目标代码块的提供方。

在一种示例性实例中,线程的个数为服务器的中央处理器cpu核心数的预设倍数。

在一种示例性实例中,由于目标代码块的个数是未知的,有可能会传入上千个目标代码块,此时理论上方案是可行的,但是基于实际情况,如服务器的资源问题,过多的线程并行执行可能会拖垮服务器导致宕机,所以规定并行计算的线程个数上线为cpu核心数的预设倍数,预设倍数的取值可以是2,即并行执行的线程个数为cpu核心数的两倍,当然预设倍数的选择不是确定的,可在系统真实上线后,监听服务器状态来调整预设倍数的取值,从而以达到充分利用服务器资源的目的。

在一种示例性实例中,目标代码块的提供方可以采用异步任务执行服务来处理服务器返回的执行结果。

本申请实施例提供的代码执行方法,由于预先构建了包含有辅助目标代码块执行的补充代码的通用对象,当获得了待执行的目标代码块后将其封装在通用对象中即能得到可以被执行的任务对象,因此避免了补充代码的即时编写,从而极大程度地节省了人力资源成本,并且提高了代码执行效率。

本申请实施例还提供一种代码执行方法,该方法采用异步任务执行服务以说明完整的代码执行过程,如图2所示,包括:

步骤201、开发人员把待执行的代码块通过预先定义的接口传入服务器。

在一种示例性实例中,代码块是逻辑代码块。

步骤202、服务器把目标代码块封装在通用对象中,成为异步任务对象(这里由于采用了asyncmission异步任务执行服务,因此上述实施例中的任务对象在本实施例中称为异步任务对象),以得到异步任务对象数组,该异步任务对象数组可定义为asyncmission异步任务对象数组。

在一种示例性实例中,asyncmission异步任务执行服务的流程可以如图3所示。

在一种示例性实例中,将多个异步任务对象放入数组即可得到异步任务对象数组,其中,数组可以由有序链表替代,以得到异步任务有序链表。

步骤203、判断异步任务对象数组中的异步任务对象的个数是否为1。

步骤204、如果异步任务对象的个数为1,直接执行该异步任务对象,并返回执行结果。

在一种示例性实例中,执行并行计算前,先判断传入的asyncmission异步任务对象数组中异步任务对象个数是否为1,当只有一个异步任务对象需要执行时,就无需走并行执行流程了,只需要直接调用asyncmission异步任务对象中开发人员的代码块即可,在得到结果后把结果存放于asyncmission异步任务对象中。

步骤205、如果异步任务对象的个数不为1,获取其个数并作为计数器初始个数。

步骤206、计算欲开启的线程个数。

在一种示例性实例中,计算服务器的cpu核心数的预设倍数,将cpu核心数的预设倍数和数组长度(即异步任务对象数组所包含的异步任务对象的个数)的最小值作为欲开启的线程个数。

步骤207、创建包含相应线程个数的线程池。

步骤208、将异步任务对象数组放入线程池。

步骤209、利用线程执行异步任务对象。

步骤210、判断执行过程是否存在异常。

步骤211、如果存在异常,判断异常次数是否达到三次,如果异常次数没有达到三次,则返回执行步骤209,如果异常次数已经达到三次,则确定执行完成并跳到步骤214。

步骤212、如果不存在异常,则确定执行完成。

步骤213、线程将执行结果返回给异步任务对象。

在一种示例性实例中,当asyncmission异步任务对象中代码块执行出现了异常,执行结果也应该返回,但该返回值可以是空,可以是开发人员定义的默认值。

步骤214、异步任务对象把返回的结果存储在自身属性中。

步骤215、开发人员根据存储在异步任务对象中的结果判断全部任务是否执行完成。

步骤216、如果没有完成,则进行阻塞等待,直到全部完成。

在一种示例性实例中,asyncservice异步任务服务可以获取到asyncmission异步任务对象数组后,就可以开始对全部任务进行调用了,实现这个功能,需要两个关键,第一个是开启多线程把每个任务放在一个线程内执行,接着就是全部代码执行完之前,需要对异步任务服务进行阻塞,防止代码出现未执行完成就进行下一步基于结果的计算,避免出现空指针异常等情况。在此过程中在这里,可以使用java中的计数器(countdownlatch)来实现,该计数器能够实现在计数器归零前使程序阻塞的效果,在使用过程中,每当一个任务执行完成,就让计数器减一,最后当计数器清零时,asyncservice异步任务服务的执行方法就不再阻塞,这时程序就会继续运行,同时所有的结果也已经计算完成;并且在计数器减一的过程中,需要注意的是,当代码块执行过程中出现未知性异常(即开发人员编写代码时未必能发现的异常)时,则重新执行该代码块两次并且计数器不能减一,当一共三次执行均抛出异常,那么默认给该代码块返回结果为空,接着才让计数器减一。除了计数器的方法还可以是基于cyclicbarrier、semaphore、blockingqueue的方式去实现,这些方法均是在多个任务并行执行的同时,让主任务线程(开发人员调用asyncservice异步任务服务的线程)发生阻塞,等待所有任务执行完成后,才让主任务继续进行。

步骤217、如果全部完成,则开发人员在异步任务对象中获取执行结果。

在一种示例性实例中,

在一种示例性实例中,本申请实施例提供的代码执行方法对外提供给开发人员的就只有一个服务类(asyncservice)、一个抽象类(asyncmission)而已,开发人员把多个需要并行计算的代码块组成asyncmission异步任务对象数组,传入asyncservice异步任务服务中执行后,即可从asyncmission异步任务对象数组中获取计算结果了,而且由于数组是有序的,所以可以根据传入的数据顺序来获取每一个代码块的计算结果。

本申请实施例还提供一种服务器,如图3所示,该服务器3包括:

预处理模块31,用于通过预先定义的接口获取若干个待执行的目标代码块,并将获得的目标代码块封装在预先构建的通用对象中,以得到若干个任务对象;其中,通用对象包含有辅助目标代码块执行的补充代码,一个目标代码块封装在一个通用对象中。

执行模块32,用于利用若干个线程并行执行若干个任务对象以得到若干个执行结果。

反馈模块33,用于将获得的执行结果返回给目标代码块的提供方。

在一种示例性实例中,预处理模块31,具体用于将目标代码块的内容写入通用对象的call方法中实现目标代码块封装在通用对象中。

在一种示例性实例中,执行模块32,具体用于:

利用若干个线程按照单例设计模式对任务对象中的call方法进行包装,得到若干个线程对象。

并行执行获得的若干个线程对象以得到若干个执行结果。

在一种示例性实例中,在利用若干个线程并行执行若干个任务对象以得到若干个执行结果的过程中,当利用第一线程执行第一任务对象发生已知执行异常情况,第一线程对应的执行结果为第一结果值;其中,第一结果值为预先确定的用于表示已知执行异常的结果值。

在一种示例性实例中,在利用若干个线程并行执行若干个任务对象以得到若干个执行结果的过程中,当利用第二线程执行第二任务对象发生未知执行异常情况,执行模块32,还用于再次利用第二线程执行第二任务对象,直到不再发生未知执行异常情况或者重复执行次数到达预设次数。当利用第二线程执行第二任务对象发生未知执行异常情况且重复执行次数到达预设次数,第二线程对应的执行结果为第二结果值;其中,第二结果值为预先确定的用于表示未知执行异常的结果值。

在一种示例性实例中,在利用若干个线程并行执行若干个任务对象以得到若干个执行结果的过程中,当利用第三线程执行第三任务对象发生执行中断情况,执行模块32,还用于停止第三线程与未执行完成的其他线程的执行过程,并获取执行日志返回给目标代码块的提供方。第三线程与未执行完成的其他线程对应的执行结果为第三结果值,其中,第三结果值为预先确定的用于表示执行中断的结果值。

在一种示例性实例中,线程的个数为服务器的cpu核心数的预设倍数。

本申请实施例提供的服务器,由于预先构建了包含有辅助目标代码块执行的补充代码的通用对象,当获得了待执行的目标代码块后将其封装在通用对象中即能得到可以被执行的任务对象,因此避免了补充代码的即时编写,从而极大程度地节省了人力资源成本,并且提高了代码执行效率。

在实际应用中,所述预处理模块31、执行模块32和反馈模块33由位于服务器中的中央处理器(centralprocessingunit,cpu)、微处理器(microprocessorunit,mpu)、数字信号处理器(digitalsignalprocessor,dsp)或现场可编程门阵列(fieldprogrammablegatearray,fpga)等实现。

本申请实施例还提供一种代码执行装置,包括:处理器和存储器,其中,所述存储器中存储有计算机程序,所述计算机程序被所述处理器执行时实现如上述任意一种所述的方法的处理。

本申请实施例还提供一种存储介质,存储介质上存储有计算机可执行命令,计算机可执行命令用于执行如上述任意一种所述的方法的处理。

本领域普通技术人员可以理解,上文中所公开方法中的全部或某些步骤、系统、装置中的功能模块/单元可以被实施为软件、固件、硬件及其适当的组合。在硬件实施方式中,在以上描述中提及的功能模块/单元之间的划分不一定对应于物理组件的划分;例如,一个物理组件可以具有多个功能,或者一个功能或步骤可以由若干物理组件合作执行。某些组件或所有组件可以被实施为由处理器,如数字信号处理器或微处理器执行的软件,或者被实施为硬件,或者被实施为集成电路,如专用集成电路。这样的软件可以分布在计算机可读介质上,计算机可读介质可以包括计算机存储介质(或非暂时性介质)和通信介质(或暂时性介质)。如本领域普通技术人员公知的,术语计算机存储介质包括在用于存储信息(诸如计算机可读指令、数据结构、程序模块或其他数据)的任何方法或技术中实施的易失性和非易失性、可移除和不可移除介质。计算机存储介质包括但不限于ram、rom、eeprom、闪存或其他存储器技术、cd-rom、数字多功能盘(dvd)或其他光盘存储、磁盒、磁带、磁盘存储或其他磁存储装置、或者可以用于存储期望的信息并且可以被计算机访问的任何其他的介质。此外,本领域普通技术人员公知的是,通信介质通常包含计算机可读指令、数据结构、程序模块或者诸如载波或其他传输机制之类的调制数据信号中的其他数据,并且可包括任何信息递送介质。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1