测试单元的运行方法、装置、设备和存储介质与流程

文档序号:26139406发布日期:2021-08-03 14:22阅读:88来源:国知局
测试单元的运行方法、装置、设备和存储介质与流程

本公开涉及计算机技术领域,具体涉及深度学习等人工智能技术领域,尤其涉及一种测试单元的运行方法、装置、设备和存储介质。



背景技术:

深度学习框架是人工智能领域的重要基础工具。由于深度学习框架功能复杂,模块众多,因此引入了大量的测试单元来保证功能稳定性。深度学习框架中的代码修改后,为了保证代码修改的正确性,在每进行一次代码改动时,一般需要运行深度学习框架中的全部测试单元。

相关技术中,全部测试单元运行时,采用串行运行的方式。



技术实现要素:

本公开提供了一种测试单元的运行方法、装置、设备和存储介质。

根据本公开的一方面,提供了一种测试单元的运行方法,包括:基于多个测试单元的原始分组并发运行所述多个测试单元,并获取所述并发运行的运行结果,所述原始分组基于所述多个测试单元的资源使用率确定;若存在所述运行结果为运行失败的测试单元,重新对所述多个测试单元进行分组,以得到所述多个测试单元的调整分组;基于所述调整分组,重新并发运行所述多个测试单元,直至不存在运行失败的测试单元。

根据本公开的另一方面,提供了一种测试单元的运行装置,包括:第一运行模块,用于基于多个测试单元的原始分组并发运行所述多个测试单元,并获取所述并发运行的运行结果,所述原始分组基于所述多个测试单元的资源使用率确定;调整模块,用于若存在所述运行结果为运行失败的测试单元,重新对所述多个测试单元进行分组,以得到所述多个测试单元的调整分组;第二运行模块,用于基于所述调整分组,重新并发运行所述多个测试单元,直至不存在运行失败的测试单元。

根据本公开的另一方面,提供了一种电子设备,包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如上述任一方面的任一项所述的方法。

根据本公开的另一方面,提供了一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使所述计算机执行根据上述任一方面的任一项所述的方法。

根据本公开的另一方面,提供了一种计算机程序产品,包括计算机程序,所述计算机程序在被处理器执行时实现根据上述任一方面的任一项所述的方法。

根据本公开的技术方案,可以提高测试单元的运行效率。

应当理解,本部分所描述的内容并非旨在标识本公开的实施例的关键或重要特征,也不用于限制本公开的范围。本公开的其它特征将通过以下的说明书而变得容易理解。

附图说明

附图用于更好地理解本方案,不构成对本公开的限定。其中:

图1是根据本公开第一实施例的示意图;

图2是根据本公开第二实施例的示意图;

图3是根据本公开第三实施例的示意图;

图4是根据本公开第四实施例的示意图;

图5是根据本公开第五实施例的示意图;

图6是根据本公开第六实施例的示意图;

图7是用来实现本公开实施例的测试单元的运行方法中任一方法的电子设备的示意图。

具体实施方式

以下结合附图对本公开的示范性实施例做出说明,其中包括本公开实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本公开的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。

深度学习框架,比如paddlepaddle、pytorch、tensorflow等是开源模式,深度学习框架中包括大量的测试单元,吸引了全球开发者为其贡献代码,代码修改十分频繁,在每进行一次代码改动时,一般都是运行深度学习框架中的全部测试单元,来确保代码修改的正确性。

深度学习框架中,会为显卡初始化统一计算设备架构(computeunifieddevicearchitecture,cuda)上下文,为了避免cuda上下文的资源冲突、显存不足等问题,相关技术中,各个测试单元是独占显卡运行,不同测试单元之间是串行的运行方式。

随着时间增长以及深度学习框架功能的不断增加,测试单元数量在不断增加,总运行时间也不断增长,以飞桨深度学习框架为例,其中包含1200+个测试单元,进行完整一次运行的时间超过60分钟(min),这导致深度学习框架开发者的效率低下,需要耗费大量时间在等待测试单元运行的过程中,如何降低深度学习框架测试单元的运行时间,成为了亟需解决的问题,其对于提升开发者研发效率、节约机器资源成本具有重大意义。

为了提高效率,可以采用并发的运行方式,但是,如果对测试单元进行随机的并发处理,会存在由于资源冲突等原因导致的测试单元运行失败,测试单元也就失去了功能验证的意义。

深度学习框架中,不同测试单元对显卡的占用情况有较大区别,有些测试单元在运行时对显卡的使用率较高,而有些测试单元在运行时对显卡的使用率较低,比如,仅需要占用1%的显卡。若按照串行的运行方式,这些资源使用率低的测试单元也需要长时间独占显卡运行,造成资源浪费。

为了解决相关技术中测试单元的串行运行方式存在的效率低的问题,本公开提供如下实施例。

图1是根据本公开第一实施例的示意图。该实施例提供一种测试单元的运行方法,包括:

101、基于多个测试单元的原始分组并发运行所述多个测试单元,并获取所述并发运行的运行结果,所述原始分组基于所述多个测试单元的资源使用率确定。

102、若存在所述运行结果为运行失败的测试单元,重新对所述多个测试单元进行分组,以得到所述多个测试单元的调整分组。

103、基于所述调整分组,重新并发运行所述多个测试单元,直至不存在运行失败的测试单元。

本实施例的执行主体可以为深度学习框架中的处理器,具体可以是处理器接收到开发者发送的用于触发测试单元运行的指令后,执行该方法。

大型软件项目开发过程中,为了保证软件质量,开发者会开发大量测试软件功能是否正常的测试程序,这些测试程序可以称为测试单元。特别是在由多人协作的开源社区中,开发者众多,代码量庞大,此时,测试单元就成了保证软件质量的重要手段,是持续集成过程中不可或缺的一环。测试单元还可以称为单元测试,单测等。

基于开源模式的深度学习框架中,开发者修改代码后,可以触发深度学习框架运行其内的全部测试单元,以测试修改后的代码是否正确。开发者修改代码以及触发代码的测试,可以认为是在线过程,开发者修改代码之前的过程可以认为是离线过程。测试单元的原始分组可以是在离线过程中确定的,上述的101~103可以是在线实现。即,深度学习框架中可以预先配置原始分组,在开发者触发测试单元运行后,深度学习框架依据预先配置的原始分组对测试单元进行并发运行,若存在运行失败的测试单元,则对原始分组进行调整,以得到调整分组,再基于调整分组重新并发运行测试单元。

深度学习框架中可以预先配置有脚本,开发者触发测试单元运行时,该脚本也被触发执行,即,深度学习框架接收到开发者的触发测试单元运行的指令后,启动该脚本,该脚本被配置为执行上述的101~103。

原始分组是指开发者触发测试单元运行之前已经存在的分组,调整分组是指对原始分组中的测试单元进行调整后得到的分组。原始分组和调整分组均至少包括两个分组,各个分组包括至少一个测试单元,至少一个相对应的原始分组和调整分组中包括的测试单元不同。比如,原始分组包括a组和b组,a组包括测试单元-1和测试单元-2,b组包括测试单元-3,假设需要将测试单元-1调整到b组,则调整分组的a组包括测试单元-2,调整分组的b组包括测试单元-2和测试单元-3。

测试单元的原始分组基于测试单元的资源使用率确定,比如,可以在离线过程中,基于所述各个测试单元运行时的资源使用率分为至少两个分组,不同分组中的资源使用率不同,将所述至少两个分组作为所述初始分组。具体地,可以逐一运行单个的测试单元,获取单个的测试单元运行时的资源使用率,在基于资源使用率的大小,将资源使用率较小的测试单元分为一组,将资源使用率较大的测试单元分为另一组等。

通过基于资源使用率,可以将全部的测试单元分为多个分组。

资源使用率比如包括:图形处理器(graphicsprocessingunit,gpu)使用率,和/或,显卡使用率。

并发运行测试单元是指,对至少一组中的测试单元,进行并发处理。不同组之间是串行运行,不同组中的测试单元的并发数量可以不同。比如,原始分组可以分为4个分组,表示为a组、b组、c组、d组,a组中的并发数量为16,b组中的并发数量为4等。

对测试单元进行并发运行后,可以获取运行结果,运行结果可以为:存在运行失败的测试单元,或者,不存在运行失败的测试单元。

在存在运行失败的测试单元时,说明原始分组中存在不合理的地方,需要进行分组调整,对原始分组进行调整后的分组可以称为调整分组。比如,原始分组中,a组包括测试单元-1和测试单元-2,经过并发运行,测试单元-1运行失败,则可以将测试单元-1从a组中去除,调整到其他分组中,相应的调整分组的a组中不再包括测试单元-1。

在得到调整分组后,可以基于调整分组重新并发运行测试单元,直至不存在运行失败的测试单元。

本实施例中,通过并发运行的方式,可以提高测试单元的运行效率。并且,在存在运行失败的测试单元时,调整原始分组,并基于调整后的调整分组重新并发运行,直至不存在运行失败的测试单元,可以保证测试单元的测试功能的成功。

图2是根据本公开第二实施例的示意图。该实施例提供一种测试单元的运行方法,包括:

201、离线阶段,确定测试单元的原始分组。

202、在线阶段,并发运行所述测试单元。

其中,原始分组可以是深度学习框架确定并提供给开发者的,或者,若某个开发者对深度学习框架确定的原始分组进行调整后,对于该开发者之后的开发者,该之后的开发者对应的原始分组,则为该之前的开发者已经调整后的分组。比如,深度学习框架确定的分组包括:a组包括测试单元-1、测试单元-2和测试单元-3,b组包括测试单元-4,某个开发者在触发测试单元并发运行后,发现测试单元-1运行失败,则可以将测试单元-1调整到b组,从而经过该开发者的触发,分组为a组包括测试单元-2和测试单元-3,b组包括测试单元-1和测试单元-4,作为之后开发者的原始分组。

以深度学习框架确定原始分组为例,离线阶段的流程可以包括:对所述多个测试单元中的各个测试单元进行单独运行,以得到所述各个测试单元运行时的资源使用率;基于所述各个测试单元运行时的资源使用率,对所述多个测试单元进行分组,以得到所述原始分组;若所述原始分组中存在冲突的测试单元,将存在冲突的测试单元调整到不同的原始分组中,以更新所述原始分组。

通过基于资源使用率进行分组,可以尽量避免资源重复;通过对原始分组进行更新,可以提高原始分组的准确度。

进一步地,所述存在冲突的测试单元为多个,所述原始分组包括第一分组和第二分组,所述将存在冲突的测试单元调整到不同的原始分组中,包括:将所述存在冲突的测试单元中的至少一个,从第一分组调整到第二分组中,所述第一分组的资源使用率小于所述第二分组的资源使用率。

通过对存在冲突的测试单元进行降级处理,可以避免存在冲突的测试单元位于同一分组时可能存在的运行冲突问题。

具体地,如图3所示,离线阶段的流程可以包括:

301、分别将多个测试单元中的各个测试单元作为当前测试单元,并运行所述当前测试单元。

其中,可以逐一运各个测试单元,即当前测试单元运行时,保持其他测试单元为非运行状态。

302、轮询当前测试单元是否运行完成,若是,执行306,否则执行303。

其中,可以每隔预设时长进行一次轮询,预设时长比如为0.01秒,则可以每隔0.01秒轮询一次当前测试单元是否运行完成。

303、采集当前资源使用率。

当前资源使用率是指当前检测时获取的资源使用率,资源使用率比如包括:显卡使用率,和/或,gpu使用率。

304、判断当前资源使用率是否大于记录值,若是,执行305,否则重新执行302及其后续步骤。

305、用当前资源使用率更新记录值。

其中,记录值的初始值可以设置,比如设置为0,之后可以进行更新。

306、判断是否运行了全部的测试单元,若是,否则重新执行301及其后续步骤。

307、记录各个测试单元对应的资源使用率。

其中,各个测试单元对应的资源使用率为更新后的记录值。

308、基于各个测试单元对应的资源使用率,对全部的测试单元进行分组,以得到原始分组。

以分为4组为例,假设4组分别表示为a组、b组、c组和d组,则上述4组的分组依据可以如下:

a组:显卡使用率和gpu使用率均为0的测试单元。开发者在编写测试单元时,对于不涉及cuda逻辑的深度学习模块,是没有占用显卡的。

b组:显卡使用率和gpu使用率均大于0且小于或等于10%的测试单元,该部分测试单元对显卡有较小的占用;

c组:显卡使用率和gpu使用率均大于10%且小于或等于30%的测试单元,该部分测试单元对显卡有部分占用;

d组:显卡使用率和gpu使用率均大于30%的测试单元,该部分测试单元对显卡有较高的占用。

309、对原始分组中存在冲突的测试单元进行调整,以更新原始分组。

其中,存在冲突可以包括:运行冲突,和/或,cuda上下文冲突。

运行冲突比如包括:读写同名文件,和/或,存在测试单元间的前后依赖关系。存在测试单元间的前后依赖关系比如一个测试单元为建立模型的测试单元,另一个测试单元为应用该模型的测试单元。针对读写同名文件的多个测试单元,可以将其中的一个或多个降级到其他的分组中,针对存在测试单元间的前后依赖关系的多个测试单元,可以将依赖的测试单元(比如上述的应用模型的测试单元)降级到其他的分组中。降级是指从资源使用率低的分组调整到资源使用率高的分组,比如,上述分组中,从a组调整到b组为降级,反之为升级。若a组包括存在冲突的测试单元-1和测试单元-2,则可以将测试单元-1调整到b组。

cuda上下文冲突比如包括:继承自相同基类的同类型测试单元。在深度学习框架中,为了避免重复开发、降低开销等问题,可以编写一个基类,多个子类同继承该基类。比如,对应相同的一个基类,该基类可以对应多个学习率的测试方法的子类,则这多个学习率的测试方法的子类需要调整到不同的分组中。

通过上述流程可以得到原始分组,在确定原始分组后,可以在线运行时,对原始分组进行调整,以得到调整分组,最终基于调整分组并发运行测试单元。在线流程可以如101~103所述。

进一步地,另一实施例中,在线流程可以包括:

在所述原始分组的各个分组中,并发运行预设个数的测试单元,不同分组对应的预设个数不同。一般来讲,资源使用率少的分组,对应的并发数量,即上述的预设个数较大,反之,资源使用率多的分组,对应的并发数量较少。比如,上述的a组的并发数量最大,d组最少。

通过不同分组对应不同的并发数量,可以依据不同分组的特点进行合理的并发运行,提高效率并降低冲突的可能性。

若并发运行后,存在运行失败的测试单元,则可以将所述运行失败的测试单元,从所述原始分组中调整到调整分组中,所述调整分组的资源使用率高于所述原始分组的资源使用率。即,对于运行失败的测试单元,可以对其降级处理,由于降级所在的分组并发数量较少,可以尽量避免测试单元的运行失败。

如图4所示,该方法可以包括:

401、a组测试单元,16个并发运行。

402、b组测试单元,4个并发运行。

403、c组测试单元,2个并发运行。

404、d组测试单元,串行依次运行。

其中,401-404的执行顺序不限定,不同分组(a组、b组、c组和d组)之间串行执行。

405、判断是否存在运行失败的测试单元,若是,执行406,否则执行407。

406、对运行失败的测试单元进行降级处理,以得到调整分组。之后基于调整分组,重新执行401及其后续步骤。

对于运行失败的测试单元,从原始分组调整到新的分组,以得到调整分组。其中,从原始分组调整到新的分组可以是,调整分组与原始分组的数量一致,在不同组内调整,或者,也可以是新增加一个分组,将运行失败的分组调整到新增加的分组中。调整分组的资源使用率高于所述原始分组的资源使用率。假设原始分组和调整分组都为上述的a组、b组、c组和d组,假设a组中的测试单元-1运行失败,则可以将测试单元-1调整到b组。

407、确定规则,结束。

即,将不存在运行失败的测试单元的分组,该分组可以为原始分组或者为调整分组,作为最终的分组。之后可以基于该最终的分组进行并发运行。

以飞桨深度学习平台为例,通过对其1200+个测试单元,基于上述的并发处理方案,可以降低测试单元总运行时间25%,提高了gpu和显卡的资源利用率,提升了测试单元的运行效率。并且通过在测试单元运行失败后进行分组调整,可以保证深度学习框架的测试单元的运行稳定性,不引入其他负面的风险因素。

图5是根据本公开第三实施例的示意图,如图5所示,该方法包括:

501、确定测试单元的原始分组。

确定原始分组的流程可以如图3所示。

502、接收到用于触发测试单元运行的指令后,根据预先配置的映射关系,判断是否触发单一的测试单元,若是,执行503,否则执行504。

其中,可以预先配置各种代码与测试单元的映射关系,开发者进行代码修改后,可以触发深度学习框架运行测试单元,此时,用于触发测试单元运行的指令中可以包括所修改的代码的信息,以根据该信息和映射关系判断是否能触发某个测试单元。比如,可以配置学习率的测试方法对应的代码对应测试单元-1,则深度学习框架接收到用于触发测试单元运行的指令时,该指令中可以包括代码标识-1,若预先配置的映射关系中代码标识-1对应测试单元-1,则可以确定触发单一的测试单元,即测试单元-1。

503、运行该单一的测试单元。

比如,触发测试单元-1。对于其他测试单元,可以保持非运行状态。

可以理解的是,上述以代码触发单一的测试单元为例,若某个或某些代码对应多个测试单元,则可以触发这些多个测试单元进行串行。进一步地,还可以设置触发的测试单元的个数,若小于或等于设置的个数值时,触发这些测试单元进行串行,若大于设置的个数值时,则可以进行对这些测试单元进行并发运行,并发运行时可以依照504的步骤执行。

504、并发运行测试单元。

具体流程可以如101~103所示。

本实施例中,通过映射关系,可以仅触发与代码对应的测试单元的运行,可以实现精准触发,从而提高运行效率。并且在无法映射到对应的测试单元时采用并发运行方案,可以实现精准触发和并发运行的相互结合,共同提高运行效率。

图6是根据本公开第六实施例的示意图,本实施例提供一种测试单元的运行装置。如图6所示,测试单元的运行装置600包括第一运行模块601、调整模块602和第二运行模块603。

第一运行模块601用于基于多个测试单元的原始分组并发运行所述多个测试单元,并获取所述并发运行的运行结果,所述原始分组基于所述多个测试单元的资源使用率确定;调整模块602用于若存在所述运行结果为运行失败的测试单元,重新对所述多个测试单元进行分组,以得到所述多个测试单元的调整分组;第二运行模块603用于基于所述调整分组,重新并发运行所述多个测试单元,直至不存在运行失败的测试单元。

一些实施例中,该装置还包括:统计模块、分组模块和更新模块。

统计模块,用于对所述多个测试单元中的各个测试单元进行单独运行,以得到所述各个测试单元运行时的资源使用率;分组模块,用于基于所述各个测试单元运行时的资源使用率,对所述多个测试单元进行分组,以得到所述原始分组;更新模块,用于若所述原始分组中存在冲突的测试单元,将存在冲突的测试单元调整到不同的原始分组中,以更新所述原始分组。

一些实施例中,所述分组模块具体用于:基于所述各个测试单元运行时的资源使用率分为至少两个分组,不同分组中的资源使用率不同,将所述至少两个分组作为所述原始分组。

一些实施例中,所述存在冲突的测试单元为多个,所述原始分组包括第一分组和第二分组,所述更新模块具体用于:将所述存在冲突的测试单元中的至少一个,从所述第一分组调整到所述第二分组中,所述第一分组的资源使用率小于所述第二分组的资源使用率。

一些实施例中,所述原始分组包括多个分组,所述第一运行模块具体用于:在所述原始分组的各个分组中,并发运行预设个数的测试单元,不同分组对应的预设个数不同。

一些实施例中,所述调整模块具体用于:将所述运行结果为运行失败的测试单元,从所述原始分组调整到新的分组,以得到所述多个测试单元的调整分组,所述调整分组的并发数量小于所述原始分组的并发数量。

本公开实施例中,通过并发运行的方式,可以提高测试单元的运行效率。并且,在存在运行失败的测试单元时,调整原始分组,并基于调整后的调整分组重新并发运行,直至不存在运行失败的测试单元,可以保证测试单元的测试功能的成功;通过基于资源使用率进行分组,可以尽量避免资源重复;通过对原始分组进行更新,可以提高原始分组的准确度;通过对存在冲突的测试单元进行降级处理,可以避免存在冲突的测试单元位于同一分组时可能存在的运行冲突问题;通过不同分组对应不同的并发数量,可以依据不同分组的特点进行合理的并发运行,提高效率并降低冲突的可能性;通过在测试单元运行失败后进行分组调整,可以保证深度学习框架的测试单元的运行稳定性。

可以理解的是,本公开实施例中,不同实施例中的相同或相似内容可以相互参考。

可以理解的是,本公开实施例中的“第一”、“第二”等只是用于区分,不表示重要程度高低、时序先后等。

根据本公开的实施例,本公开还提供了一种电子设备、一种可读存储介质和一种计算机程序产品。

图7示出了可以用来实施本公开的实施例的示例电子设备700的示意性框图。电子设备旨在表示各种形式的数字计算机,诸如,膝上型计算机、台式计算机、工作台、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字助理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本公开的实现。

如图7所示,电子设备700包括计算单元701,其可以根据存储在只读存储器(rom)702中的计算机程序或者从存储单元708加载到随机访问存储器(ram)703中的计算机程序,来执行各种适当的动作和处理。在ram703中,还可存储电子设备700操作所需的各种程序和数据。计算单元701、rom602以及ram703通过总线704彼此相连。输入/输出(i/o)接口705也连接至总线704。

电子设备700中的多个部件连接至i/o接口705,包括:输入单元706,例如键盘、鼠标等;输出单元707,例如各种类型的显示器、扬声器等;存储单元708,例如磁盘、光盘等;以及通信单元709,例如网卡、调制解调器、无线通信收发机等。通信单元709允许电子设备700通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。

计算单元701可以是各种具有处理和计算能力的通用和/或专用处理组件。计算单元701的一些示例包括但不限于中央处理单元(cpu)、图形处理单元(gpu)、各种专用的人工智能(ai)计算芯片、各种运行机器学习模型算法的计算单元、数字信号处理器(dsp)、以及任何适当的处理器、控制器、微控制器等。计算单元701执行上文所描述的各个方法和处理,例如测试单元的运行方法。例如,在一些实施例中,测试单元的运行方法可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元708。在一些实施例中,计算机程序的部分或者全部可以经由rom702和/或通信单元709而被载入和/或安装到电子设备700上。当计算机程序加载到ram703并由计算单元701执行时,可以执行上文描述的测试单元的运行方法的一个或多个步骤。备选地,在其他实施例中,计算单元701可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行测试单元的运行方法。

本文中以上描述的系统和技术的各种实施方式可以在数字电子电路系统、集成电路系统、场可编程门阵列(fpga)、专用集成电路(asic)、专用标准产品(assp)、芯片上系统的系统(soc)、负载可编程逻辑设备(cpld)、计算机硬件、固件、软件、和/或它们的组合中实现。这些各种实施方式可以包括:实施在一个或者多个计算机程序中,该一个或者多个计算机程序可在包括至少一个可编程处理器的可编程系统上执行和/或解释,该可编程处理器可以是专用或者通用可编程处理器,可以从存储系统、至少一个输入装置、和至少一个输出装置接收数据和指令,并且将数据和指令传输至该存储系统、该至少一个输入装置、和该至少一个输出装置。

用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。

在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom或快闪存储器)、光纤、便捷式紧凑盘只读存储器(cd-rom)、光学储存设备、磁储存设备、或上述内容的任何合适组合。

为了提供与用户的交互,可以在计算机上实施此处描述的系统和技术,该计算机具有:用于向用户显示信息的显示装置(例如,crt(阴极射线管)或者lcd(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。

可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(lan)、广域网(wan)和互联网。

计算机系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。服务器可以是云服务器,又称为云计算服务器或云主机,是云计算服务体系中的一项主机产品,以解决了传统物理主机与vps服务("virtualprivateserver",或简称"vps")中,存在的管理难度大,业务扩展性弱的缺陷。服务器也可以为分布式系统的服务器,或者是结合了区块链的服务器。

应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例如,本发公开中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本公开公开的技术方案所期望的结果,本文在此不进行限制。

上述具体实施方式,并不构成对本公开保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。任何在本公开的精神和原则之内所作的修改、等同替换和改进等,均应包含在本公开保护范围之内。

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