本发明涉及计算机技术领域,尤其涉及一种覆盖率数据的处理方法、装置和服务器。
背景技术:
代码覆盖率测试,是软件测试过程中最重要的测试方法和测试效果衡量标准之一,覆盖率指的是源代码执行过程中被测试所覆盖到代码的比例和程度,通常用百分比表示。
对不同的编程语言来说,都有相应的检测代码覆盖率的方法。在针对游戏服务器的python代码覆盖率检测的过程中,通常使用的技术方案是利用python自带的sys.settrace函数进行数据收集和处理,在停止采集之后,一次性地导出覆盖率数据报告。由于代码覆盖率检测的实时性要求,随着游戏规模的增大和项目的发展,需要测试的代码量越来越高,如何更好地维护和存储覆盖率测试中获取的覆盖率数据成为了必须解决的问题。一般来说,覆盖率数据,包括了文件覆盖率数据和目录覆盖率数据,每个文件的已执行过的代码行号集合,该文件总的可执行代码行号集合等等,而每当有新的覆盖率数据到来,比如某个文件的一些代码被执行,那么就需要重新计算当前文件、当前文件所在的目录甚至于总体的覆盖率数据。目前一种具体的获取覆盖率数据的方式是利用python的sys模块中提供settrace函数,跟踪代码的执行情况,将覆盖率数据存储到Collector中的Stack中。每当开始采集时,Collector不断执行入栈操作,停止采集时,通过出栈操作即可获取已采集的覆盖率数据。
然而,当需要测试的代码量较大时,每当有新数据到来,需要存储和重新计算覆盖率,给内存和计算性能带来了很大负担,甚至会影响到被测试程序的运行,一定程度上降低了测试的效率和质量。
技术实现要素:
本发明实施例提供一种覆盖率数据的处理方法、装置和服务器,用于解决目前的方案中,当需要测试的代码量较大时,每当有新数据到来,需要存储和重新计算覆盖率,给内存和计算性能带来了很大负担,甚至会影响到被测试程序的运行,一定程度上降低了测试的效率和质量的问题。
本发明第一方面提供一种覆盖率数据的处理方法,包括:
接收服务器发送的执行数据;所述执行数据包括正在执行文件的文件名称和覆盖率数据;
查询预先建立的树形存储结构中的每层的节点,获取与所述文件名称对应的第一子节点;
根据所述覆盖率数据和预先获取的与第一子节点在同一层的其他子节点的覆盖率数据,计算获取所述服务器的总体覆盖率。
可选的,所述获取与所述文件名称对应的第一子节点之后,所述方法还包括:
将所述第一子节点下存储的数据更新为所述覆盖率数据。
可选的,所述接收服务器发送的执行数据之前,所述方法包括:
根据每个文件的文件名称和目录信息建立所述树形存储结构;其中,所述树形存储结构的根节点下包括至少一层以目录信息以及文件名称逐层建立的子节点;
根据每个子节点下的文件的执行数据计算获取与所述子节点对应的覆盖率。
可选的,所述根据所述覆盖率数据和预先获取的与第一子节点在同一层的其他子节点的覆盖率数据,计算获取所述服务器的总体覆盖率,包括:
通过所述覆盖率数据以及所述文件名称对应的源代码文件,计算所述第一子节点处的总代码行数和已执行代码的行数;
根据所述第一子节点处的总代码行数和已执行代码的行数,以及每个与所述第一子节点在同一层的其他子节点的总代码行数和已执行代码的行数,计算获取所述第一子节点所属的上一层节点处的总代码行数和已执行代码行数,将所述第一子节点所属的上一层节点作为第一子节点,重复本步骤直至计算出所述树形存储结构的根节点的处的总代码行数和已执行代码行数;
根据所述根节点处的总代码行数和已执行代码行数,计算获取所述服务器的所述总体覆盖率。
可选的,通过所述覆盖率数据以及所述文件名称对应的源代码文件,计算所述第一子节点处的总代码行数和已执行代码的行数之后,还包括:
根据所述第一子节点处的总代码行数和已执行代码的行数计算所述第一子节点的覆盖率;
将所述第一子节点的覆盖率进行更新并予以显示。
本发明第二方面提供一种覆盖率检测装置,包括:
接收模块,用于接收服务器发送的执行数据;所述执行数据包括正在执行文件的文件名称和覆盖率数据;
处理模块,用于查询预先建立的树形存储结构中的每层的节点,获取与所述文件名称对应的第一子节点;
所述处理模块还用于根据所述覆盖率数据和预先获取的与第一子节点在同一层的其他子节点的覆盖率数据,计算获取所述服务器的总体覆盖率。
可选的,所述装置还包括:
存储模块,用于将所述第一子节点下存储的数据更新为所述覆盖率数据。
可选的,所述接收模块接收服务器发送的执行数据之前,所述处理模块还用于:
根据每个文件的文件名称和目录信息建立所述树形存储结构;其中,所述树形存储结构的根节点下包括至少一层以目录信息以及文件名称逐层建立的子节点;
根据每个子节点下的文件的执行数据计算获取与所述子节点对应的覆盖率。
可选的,所述处理模块具体用于:
通过所述覆盖率数据以及所述文件名称对应的源代码文件,计算所述第一子节点处的总代码行数和已执行代码的行数;
根据所述第一子节点处的总代码行数和已执行代码的行数,以及每个与所述第一子节点在同一层的其他子节点的总代码行数和已执行代码的行数,计算获取所述第一子节点所属的上一层节点处的总代码行数和已执行代码行数,将所述第一子节点所属的上一层节点作为第一子节点,重复本步骤直至计算出所述树形存储结构的根节点的处的总代码行数和已执行代码行数;
根据所述根节点处的总代码行数和已执行代码行数,计算获取所述服务器的所述总体覆盖率。
可选的,所述处理模块还用于:
根据所述第一子节点处的总代码行数和已执行代码的行数计算所述第一子节点的覆盖率;
控制将所述第一子节点的覆盖率进行更新并予以显示。
本发明第三方面提供一种服务器,包括:存储有程序指令的存储器、接收器和用于控制程序指令执行的处理器;
所述接收器用于接收服务器发送的执行数据;所述执行数据包括正在执行文件的文件名称和覆盖率数据;
所述处理器用于:
查询预先建立的树形存储结构中的每层的节点,获取与所述文件名称对应的第一子节点;
根据所述覆盖率数据和预先获取的与第一子节点在同一层的其他子节点的覆盖率数据,计算获取所述服务器的总体覆盖率。
本发明实施例提供的覆盖率数据的处理方法、装置和服务器,在覆盖率服务器侧对接收到的每个服务器的数据建立树形存储结构,在接收到服务器发送的包括文件名称和对应的覆盖率数据时候,按照文件名称逐个节点查询只对该节点的覆盖率数据进行修改,只需要对覆盖率数据改变了的节点重新计算,然后结合其他的节点上的已知的数据计算出该服务器的总体覆盖率,不需要对所有文件遍历统计,有效减小全局数据修改和覆盖率计算带来的性能消耗,提高测试效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。
图1为本发明实施例提供的覆盖率数据的处理方法实例一的流程图;
图2为本发明实施例提供的覆盖率数据的处理方法实例二的流程图;
图3为本发明实施例提供的树形存储结构的实例示意图;
图4为本发明实施例提供的覆盖率数据的处理方法在覆盖率服务器侧的实例的流程图;
图5为本发明实施例提供的覆盖率数据的处理装置实施例一的结构示意图;
图6为本发明实施例提供的覆盖率数据的处理装置实施例二的结构示意图;
图7为本发明实施例提供的服务器实施例一的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
图1为本发明实施例提供的覆盖率数据的处理方法实例一的流程图,如图1所示,该方案的执行主体为用于检测覆盖率的服务器(即覆盖率服务器),或者检测覆盖率的其他设备,该覆盖率检测方法的具体实现步骤为:
步骤S101,接收服务器发送的执行数据;所述执行数据包括正在执行文件的文件名称和覆盖率数据。
在本实施例中,这里发送执行数据的服务器为执行该文件的程序的服务器,例如:运行游戏程序的服务器。该方案中的执行文件代码的服务器需要获取被执行的文件的文件名称以及覆盖率数据,该覆盖率数据至少包括能够指示被执行的文件已经执行的行数的信息,例如:当前执行的行号,或者已经执行的行数等。
步骤S102,查询预先建立的树形存储结构中的每层的节点,获取与所述文件名称对应的第一子节点。
该方案中,覆盖率服务器端将接收到的上述服务器发送来的所有文件的执行数据按照树形存储结构进行存储,每个节点可以使用文件的名称进行命名,节点下存储该文件名称对应的文件的覆盖率数据。
在后续接收到该服务器发送的执行数据之后,根据其中的文件名称逐层节点进行查询,将查询到的与该文件名称对应第一子节点。
可选的,可将该第一子节点存储的数据更新为执行数据中的覆盖率数据。
步骤S103,根据所述覆盖率数据和预先获取的与第一子节点在同一层的其他子节点的覆盖率数据,计算获取所述服务器的总体覆盖率。
本方案中,要获取到上述服务器的总体覆盖率,不需要对该服务器的所有文件解析一遍,只需要对接收到的执行数据中的文件名称对应的覆盖率数据以及该文件的源代码文件进行解析处理,然后结合与第一子节点同一层的其他子节点的覆盖率数据,得到这一层的已经执行的代码行数以及所有文件的源代码行数的总和,然后根据该方式逐层累加,得到该服务器上总体的已执行代码行数以及所有源代码总行,然后根据覆盖率公式计算可得到该服务器的总体覆盖率。
本实施例提供的覆盖率数据的处理方法,在覆盖率服务器侧对接收到的每个服务器的数据建立树形存储结构,在接收到服务器发送的包括文件名称和对应的覆盖率数据时候,按照文件名称逐个节点查询只对该节点的覆盖率数据进行修改,只需要对覆盖率数据改变了的节点重新计算,然后结合其他的节点上的已知的数据计算出该服务器的总体覆盖率,不需要对所有文件遍历统计,有效减小全局数据修改和覆盖率计算带来的性能消耗,提高测试效率。
图2为本发明实施例提供的覆盖率数据的处理方法实例二的流程图,如图2所示,在上述实施例的基础上,在根据文件名称查询树形存储结构中的每层的节点,获取与所述文件名称对应的第一子节点之前,该覆盖率数据的处理方法还包括:
步骤S201,根据每个文件的文件名称和目录信息建立所述树形存储结构;其中,所述树形存储结构的根节点下包括至少一层以目录信息以及文件名称逐层建立的子节点。
步骤S202,根据每个子节点下的文件的执行数据计算获取与所述子节点对应的覆盖率。
在方案中,在覆盖率服务器端,对于每个服务器的文件数据等需要预先建立树形存储结构,具体的建立的方式是:根(Root)节点表示根目录,根节点下存储的数据包括:总代码行数(由所有子节点的文件的代码行数相加得来),总已执行代码行数(由所有子节点的覆盖率数据获取到的已执行行数相加得来),以及总的覆盖率数据(由总的已执行代码行数除以总代码行数得到)。
在根节点下包括一层或者多层的子节点,其他子节点主要分为两类,一类是文件节点,代表某个文件(例如:Python的py文件)的覆盖率数据,包括该文件已经执行过的代码行数,和该文件源码中的可执行代码总行数,以及该文件的覆盖率数值。
另一类是目录节点,包含的是该目录下,所有文件和目录覆盖率数据的对应项之和,即该目录下所有文件和目录的总的已执行代码行数,和总的可执行代码行数,以及由这两项数据计算出来的覆盖率数值。
每当有数据到达时,根据目录结构依次添加和修改对应节点,如果某个文件的覆盖率数据发送变化,则可以根据文件名称逐层查询所有的节点,将该文件的覆盖率数据更新为变化后的覆盖率数据,然后重新计算出该文件的覆盖率。
这种存储方式下,无论是对某个文件的覆盖率数据进行修改更新,还是获取某个文件的覆盖率,还是获取总体的覆盖率,均不需要再去遍历所有的文件的数据去重新计算,只需要对变化了的节点进行重新计算即可,解决了代码量比较大时,全局数据修改和覆盖率数据重新计算时计算量较大的问题,降低性能消耗。
在上述两个实施例的基础上,下面以一种具体的实现方式对本发明提供的覆盖率数据的处理方法进行说明。
同样的,该方案在具体实现中涉及运行文件代码的服务器端(以游戏服务器为例)以及覆盖率服务器端,具体包括数据采集、数据存储以及覆盖率数据重新计算三部分。
1、初始化过程
初始化过程分为启动覆盖率数据处理服务器和嵌入覆盖率采集客户端到游戏服务器脚本中两个部分。
覆盖率服务器侧的架构基于Tornado构建,主要功能是通过websocket接收来自通过一定规则(见下文中的进程标识步骤)标识的客户端的数据,并定时将同一游戏服务器的数据合并和处理。在游戏服务器启动测试之前,首先启动覆盖率服务器,等待客户端连接和收集数据。
对于客户端,在游戏服务器中启动不同进程的脚本中,添加使用线程启动websocket连接的代码,具体如下:
ws=websocket.WebSocket("ws://websocket_address/")
thread_ws=threading.Thread(target=ws.run)
thread_ws.start()
该线程用于在每个游戏服务器进程启动websocket并连接到覆盖率服务器后,进行定时的数据发送。
2、数据采集过程,该过程在游戏服务器中实现
嵌入游戏服务器的客户端,主要通过添加如下代码实现数据采集:
即利用python自带的sys.settrace方法,在游戏服务器脚本运行过程中,每当发生了代码执行事件(event),就会调用trace方法进行跟踪,其中frame表示python运行过程中的栈帧,event表示发生的事件(例如执行了某一行代码,或者调用了某个函数等)。使用frame.f_code.co_filename获取被执行的文件名称fliename,使用frame.f_lineno获取当前执行的代码行号,然后调用collect方法进行数据收集,该方法主要是使用了字典(python的一种内置数据结构,以键-值对格式存储数据)的形式,将数据以文件名为键,以被执行的代码行号集合为值的形式存储,举例如下:
其中root/directory1/.../file1表示被测试的代码文件的路径,set([lineno11,lineno12,lineno13...])表示一个集合,该集合中的元素有lineno11,lineno12,lineno13等等,每个元素表示file1中进行覆盖率测试时,被执行过的行号(lineno)。
游戏服务器在获取到上述的数据之后需要发送给覆盖率服务器,即覆盖率服务器通过嵌入游戏服务器中的客户端获取到上述数据,需要在本地进行存储和处理,具体的实现过程如下。
首先建立树形存储结构对数据进行存储,图3为本发明实施例提供的树形存储结构的实例示意图,如图3所示,根节点表示根目录,其中包含的数据有总代码行数(由所有子节点的数据相加得来),总已执行代码行数(由所有子节点的数据相加得来),以及总的覆盖率数据(由总的已执行代码行数除以总代码行数得到)。
其他节点主要分为两类,一类是文件节点,代表某个文件(例如Python的py文件)的覆盖率数据,包括该文件已经执行过的代码行数,和该文件源码中的可执行代码总行数,以及该文件的覆盖率数值。
另一类是目录节点,包含的是该目录下,所有文件和目录覆盖率数据的对应项之和,即该目录下所有文件和目录的总的已执行代码行数,和总的可执行代码行数,以及由这两项数据计算出来的覆盖率数值。
图4为本发明实施例提供的覆盖率数据的处理方法在覆盖率服务器侧的实例的流程图;如图4所示,在覆盖率服务器侧,存储和处理过程具体如下:
步骤S301,接收服务器发送的执行数据;所述执行数据包括正在执行文件的文件名称和覆盖率数据。
步骤S302,查询预先建立的树形存储结构中的每层的节点,获取与所述文件名称对应的第一子节点。
步骤S303,将所述第一子节点下存储的数据更新为所述覆盖率数据。
在上述几个步骤的具体实现跟实施例一种类似。
具体的,如图3所示的结构,每当有执行数据到达时,根据目录结构依次添加和修改对应节点,即将执行数据对应的节点的数据进行更新,例如,某文件名称为directory01/file11.py,则首先从根目录开始搜索,找到directory01节点,然后继续向下搜索,找到file11节点,覆盖率数据的格式,已执行的代码行数由上节所述('root/directory1/.../file1':set([lineno11,lineno12,lineno13...]))表示。
如果需要获取该服务器的总体覆盖率,则在执行完上述步骤后,可按照步骤S304-S306所示的步骤进行执行。
步骤S304,通过所述覆盖率数据以及所述文件名称对应的源代码文件,计算所述第一子节点处的总代码行数和已执行代码的行数。
步骤S305,根据所述第一子节点处的总代码行数和已执行代码的行数,以及每个与所述第一子节点在同一层的其他子节点的总代码行数和已执行代码的行数,计算获取所述第一子节点所属的上一层节点处的总代码行数和已执行代码行数,将所述第一子节点所属的上一层节点作为第一子节点,重复本步骤直至计算出所述树形存储结构的根节点的处的总代码行数和已执行代码行数。
在本步骤之后,可选的,由于第一子节点处的覆盖率数据发生变化,因此该第一子节点处的文件的覆盖率也发生变化,在具体实现中可以根据得到的第一子节点处的总代码行数和已执行代码的行数重新计算该第一子节点处的覆盖率,并将第一子节点处原来存储的覆盖率更新为重新计算得到的覆盖率,并可以根据查询请求予以显示,或者直接展示给用户。
步骤S306,根据所述根节点处的总代码行数和已执行代码行数,计算获取所述服务器的所述总体覆盖率。
上述几个步骤的含义是:每个文件子节点分别记录覆盖率数据的中的已执行行数与源代码行数,在计算总覆盖率时,需要将跟节点(根目录)进行数据汇总,逐层将每个节点的已执行行数相加,再将所有代源码行数相加,然后使用根节点处的已执行行数除以总代码行数得到总覆盖率。
对于各个子节点来说,虽然根节点并不直接使用各自的覆盖率,但还是会分别计算自身的覆盖率,并将得到的节点处的覆盖率进行存储,根据查询请求进行展示。
如图3所示实例,可通过len(set([lineno11,lineno12,lineno13...]))计算行号集合的大小即可得到,而可执行代码行数则由源码文件解析而来,具体步骤是根据数据中的文件名,找到对应本地源码文件进行解析,解析的过程是去除空白行和注释行,从而计算出真正的可执行代码行的总数。由上述步骤,获得了每个文件当前所执行过的代码行号的集合,已知覆盖率计算公式为:
其中,Rate表示覆盖率,lineexecute表示已经执行过的代码行数,linetotal可执行代码行总数。
根据所有文件中可执行代码的总行数以及已经执行的行数,计算得到该服务器的总覆盖率。
在上述方案中,每当新数据到来,依次修改到文件子节点后,首先对子节点发生变化的父节点(目录节点)重新计算已执行代码行数、总代码行数以及覆盖率数值;然后按照相同逻辑,如果某个节点的子节点数据发生了变化,则重新计算,否则不变。最后在根节点重新结算总的覆盖率数据即可。
如图3所示,若节点“文件Nk”的数据发生了变化,则其兄弟节点的数据保持不变,只需要重新计算文件Nk节点、目录0N节点以及根节点的数据即可。
本发明提供的覆盖率数据的处理方法,通过将同一个服务器上的文件根据目录进行树形结构存储,在覆盖率数据发送修改时,逐个节点查询只对该节点的覆盖率数据进行修改,只需要对改变了的节点重新计算,有效减小全局数据修改和覆盖率计算带来的性能消耗,提高测试效率。即解决了代码量较大时,全局的数据修改和覆盖率数据重新计算带来的性能消耗较高的问题。
图5为本发明实施例提供的覆盖率数据的处理装置实施例一的结构示意图,如图5所示,本实施例提供的覆盖率数据的处理装置10包括:
接收模块11,用于接收服务器发送的执行数据;所述执行数据包括正在执行文件的文件名称和覆盖率数据;
处理模块12,用于查询预先建立的树形存储结构中的每层的节点,获取与所述文件名称对应的第一子节点;
所述处理模块12还用于根据所述覆盖率数据和预先获取的与第一子节点在同一层的其他子节点的覆盖率数据,计算获取所述服务器的总体覆盖率。
本实施例提供的覆盖率数据的处理装置,用于执行前述任一实施例提供的方法中覆盖率服务器的技术方案,其实现原理和技术效果类似,在此不再赘述。
在本发明覆盖率数据的处理装置的实施例二中,图6为本发明实施例提供的覆盖率数据的处理装置实施例二的结构示意图,如图6所示,在上述实施例一的基础上,该覆盖率数据的处理装置10还包括:
存储模块13,用于将所述第一子节点下存储的数据更新为所述覆盖率数据。
在上述任一实施例的基础上,可选的,所述接收模块11接收服务器发送的执行数据之前,所述处理模块12还用于:
根据每个文件的文件名称和目录信息建立所述树形存储结构;其中,所述树形存储结构的根节点下包括至少一层以目录信息以及文件名称逐层建立的子节点;
根据每个子节点下的文件的执行数据计算获取与所述子节点对应的覆盖率。
可选的,所述处理模块12具体用于:
通过所述覆盖率数据以及所述文件名称对应的源代码文件,计算所述第一子节点处的总代码行数和已执行代码的行数;
根据所述第一子节点处的总代码行数和已执行代码的行数,以及每个与所述第一子节点在同一层的其他子节点的总代码行数和已执行代码的行数,计算获取所述第一子节点所属的上一层节点处的总代码行数和已执行代码行数,将所述第一子节点所属的上一层节点作为第一子节点,重复本步骤直至计算出所述树形存储结构的根节点的处的总代码行数和已执行代码行数;
根据所述根节点处的总代码行数和已执行代码行数,计算获取所述服务器的所述总体覆盖率。
可选的,所述处理模块12还用于:
根据所述第一子节点处的总代码行数和已执行代码的行数计算所述第一子节点的覆盖率;
控制将所述第一子节点的覆盖率进行更新并予以显示。
本实施例提供的覆盖率数据的处理装置,用来执行前述任一实施例提供的方法中覆盖率服务器的技术方案,其实现原理和技术效果类似,在此不再赘述。
图7为本发明实施例提供的服务器实施例一的结构示意图,如图7所示,该服务器可以被具体实现为:存储有程序指令的存储器21、接收器22和用于控制程序指令执行的处理器23;
所述接收器22用于接收服务器发送的执行数据;所述执行数据包括正在执行文件的文件名称和覆盖率数据;
所述处理器23用于:
查询预先建立的树形存储结构中的每层的节点,获取与所述文件名称对应的第一子节点;
根据所述覆盖率数据和预先获取的与第一子节点在同一层的其他子节点的覆盖率数据,计算获取所述服务器的总体覆盖率。
可选的,所述存储器21还用于将所述第一子节点下存储的数据更新为所述覆盖率数据。
可选的,所述接收器22接收服务器发送的执行数据之前,所述处理器23还用于:
根据每个文件的文件名称和目录信息建立所述树形存储结构;其中,所述树形存储结构的根节点下包括至少一层以目录信息以及文件名称逐层建立的子节点;
根据每个子节点下的文件的执行数据计算获取与所述子节点对应的覆盖率。
可选的,所述处理器23具体用于:
通过所述覆盖率数据以及所述文件名称对应的源代码文件,计算所述第一子节点处的总代码行数和已执行代码的行数;
根据所述第一子节点处的总代码行数和已执行代码的行数,以及每个与所述第一子节点在同一层的其他子节点的总代码行数和已执行代码的行数,计算获取所述第一子节点所属的上一层节点处的总代码行数和已执行代码行数,将所述第一子节点所属的上一层节点作为第一子节点,重复本步骤直至计算出所述树形存储结构的根节点的处的总代码行数和已执行代码行数;
根据所述根节点处的总代码行数和已执行代码行数,计算获取所述服务器的所述总体覆盖率。
可选的,所述处理器23还用于:
根据所述第一子节点处的总代码行数和已执行代码的行数计算所述第一子节点的覆盖率;
控制将所述第一子节点的覆盖率进行更新并予以显示。
本实施例提供的服务器为覆盖率服务器,用来执行前述任一实施例提供的方法的技术方案,其实现原理和技术效果类似,在此不再赘述。
在上述任一服务器的实施例中,应理解,处理器可以是中央处理单元(英文:Central Processing Unit,简称:CPU),还可以是其他通用处理器、数字信号处理器(英文:Digital Signal Processor,简称:DSP)、专用集成电路(英文:Application Specific Integrated Circuit,简称:ASIC)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:只读存储器(英文:read-only memory,缩写:ROM)、RAM、快闪存储器、硬盘、固态硬盘、磁带(英文:magnetic tape)、软盘(英文:floppy disk)、光盘(英文:optical disc)及其任意组合。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。