代码异常处理、代码执行方法及装置
技术领域
本申请涉及计算机技术领域,尤其涉及代码异常处理、代码执行方法及装置。
背景技术
随着计算机技术与软件业务需求的发展,单个软件甚至软件中某个功能的代码越来越大,这样对于代码执行的效率提出了更高的要求。
通常,一个完整的代码是由若干代码段组成,所以可以将所述代码段视为功能模块,本文中将这样的代码段称之为代码节点。
现有技术中,在代码节点出现异常的情况下,代码执行设备只能从头开始执行代码。由此,导致代码执行效率较低。
发明内容
本申请提供代码异常处理、代码执行方法及装置,以解决现有技术中代码执行过程中出现异常时从头开始执行,导致代码执行效率较低的问题。
根据本申请实施例提供的一种代码异常处理方法,所述方法包括:
在代码节点出现异常后,确定与该代码节点距离最近的持久化代码节点;其中,所述持久化代码节点为具有持久化数据的代码节点;
获取该持久化代码节点的持久化数据;
以所获取的持久化数据作为输入数据,从所确定的持久化代码节点后一个代码节点开始执行。
根据本申请实施例提供的一种代码执行方法,所述方法包括:
根据预设规则对待执行的代码进行解析,从而得到所述代码中每一个代码节点所属的依赖关系,所述依赖关系包括流依赖、映射依赖和打乱依赖;
在执行每一个代码节点后,判断该代码节点是否为持久化代码节点;
如果是,则持久化该代码节点的输出数据。
根据本申请实施例提供的一种代码异常处理装置,所述装置包括:
确定单元,在代码节点出现异常后,确定与该代码节点距离最近的持久化代码节点;其中,所述持久化代码节点为具有持久化数据的代码节点;
获取单元,获取该持久化代码节点的持久化数据;
执行单元,以所获取的持久化数据作为输入数据,从所确定的持久化代码节点后一个代码节点开始执行。
根据本申请实施例提供的一种代码执行装置,所述装置应用于代码执行设备上,所述装置包括:
解析单元,根据预设规则对待执行的代码进行解析,从而得到所述代码中每一个代码节点所属的依赖关系,所述依赖关系包括流依赖、映射依赖和打乱依赖;
判断单元,在执行每一个代码节点后,判断该代码节点是否为持久化代码节点;
持久化单元,在该代码节点为持久化代码节点的情况下,持久化该代码节点的输出数据。
本申请实施例中,在代码执行过程中,通过对持久化代码节点的输出数据进行持久化处理,如此后续代码节点出现异常后,可以获取距离所述代码节点最近的持久化代码节点的持久化数据,以所述持久化数据作为输入数据,从所述持久化代码节点后一个代码节点开始执行。应用本申请实施例中,在代码节点出现异常后,无需从头开始执行,从而提高了代码执行的效率。
附图说明
图1是本申请提供的代码节点拓扑图;
图2是本申请一实施例提供的代码异常处理方法的流程图;
图3是本申请提供的代码节点拓扑图;
图4是本申请提供的代码节点拓扑图;
图5是本申请一实施例提供的代码执行方法的流程图;
图6是本申请提供的代码异常处理装置所在设备的一种硬件结构图;
图7是本申请一实施例提供的代码异常处理装置的模块示意图;
图8是本申请提供的代码执行装置所在设备的一种硬件结构图;
图9是本申请一实施例提供的代码执行装置的模块示意图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本申请可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
请参考图1为某代码对应的代码节点拓扑图,该代码完整的执行过程为:首先执行a代码节点,再执行b代码节点,最后执行c代码节点。假设a代码节点的输入数据为Assembly1。如下为该代码的执行过程:
开始执行;
执行a代码节点:对输入数据Assembly1进行处理后输出数据Assembly1’,并将Assembly1销毁;
执行b代码节点:对输入数据Assembly1’(即a代码节点的输出数据)进行处理后输出数据Assembly1”,并将Assembly1’销毁;
执行c代码节点:对输入数据Assembly1”(即b代码节点的输出数据)进行处理后输出数据Assembly,并将Assembly1”销毁;
结束执行。
整个代码执行完成后最终输出数据为Assembly。通过上述代码的执行过程可知,在每个代码节点执行完毕后都会将输入数据销毁。如此,如果代码执行过程中出现一些异常情况(代码节点执行错误或者数据发生丢失、程序崩溃等),只能从头开始执行。
为了解决上述问题,本申请实施例提出了一个代码异常处理方法,参见图2为本申请一实施例提供的代码异常处理方法的流程图,所述方法可以包括以下步骤:
步骤110:在代码节点出现异常后,确定与该代码节点距离最近的持久化代码节点;
本实施例中,一般执行代码过程中都会开启异常监测,异常检测手段是业内常用技术。通常在代码节点异常会报错,所述异常可以包括执行错误、数据异常(如数据丢失、数据错误)、程序崩溃等情况。
在代码节点出现异常后,代码执行设备就可以确定与该代码节点距离最近的持久化代码节点。其中,所述持久化代码节点为具有持久化数据的代码节点。
所述持久化代码节点用于将输出数据进行持久化。例如,假设a代码节点是持久化代码节点,那么在a代码节点执行完毕后,可以将所述a代码节点输出数据进行持久化。通常,所述持久化数据可以保存在内存中,也可以保存在硬盘中。
以下举例说明,如图3所示,某代码执行需要首先分别执行a代码节点、b代码节点,再执行c代码节点,最后执行d代码节点;其中c代码节点为持久化代码节点。该代码执行过程中,c代码节点执行完毕后会持久化输出数据;如果在执行d代码节点(当前代码节点)时出现异常,则获取距离d代码节点最近的持久化代码节点即c代码节点的持久化数据。
以下详细介绍所述持久化数据是如何生成的:
在一种可选的实施例中,所述持久化数据通过如下方式生成:
确定代码节点具有持久化标识的情况下,持久化所述代码节点的输出数据。
本实施例中,用户可以人为预先对代码节点配置持久化标识,例如某个代码节点处理数据比较复杂,输出数据比较重要,那么用户就可以对该代码节点配置一个持久化标识;当然用户也可以对该代码节点不设置持久化标识,这里只是给用户增加了一个选项。如此,在代码执行时,所述代码执行设备通过判断所述代码节点是否具有持久化标识,在确定所述代码节点具有持久化标识的情况下,持久化所述代码节点的输出数据。
在一种可选的实施例中,所述持久化数据通过如下方式生成:
确定代码节点为最后一个代码节点的情况下,持久化所述代码节点的输出数据。
通过本实施例,默认持久化最后一个代码节点的输出数据,如果发生输出数据丢失的情况,可以快速获取最后一个代码节点的持久化数据。
在另一种可选的实施例中,所述持久化数据可以通过如下方式中的至少一种生成:
第一种:确定代码节点与前一级代码节点之间为流依赖的情况下,持久化所述代码节点的输出数据;
第二种:确定代码节点与前一级代码节点之间为映射依赖的情况下,持久化所述代码节点的输出数据;
第三种:确定代码节点与前一级代码节点之间为打乱依赖的情况下,持久化所述代码节点的输出数据。
本实施例中,所述前一级代码节点是当前代码节点前并和当前代码节点有直接联系的代码节点。例如,图3中c代码节点的前一级代码节点为a代码节点和b代码节点;d代码节点的前一级代码节点为c代码节点;a代码节点、b代码节点没有上一级代码节点。
所述流依赖:代码节点的输入数据只来自一个上一级代码节点的输出数据;定义这两个代码节点之间为流依赖。如图3中c代码节点->d代码节点,因为d代码节点的输入数据只来自c代码节点的输出数据,所以可以确定d代码节点与c代码节点之间为流依赖。
映射依赖:代码节点的输入数据至少来自两个上一级代码节点的输出数据,并且该代码节点的输出数据一一对应输入数据;定义代码节点与多个上一级代码节点之间为映射依赖。如图3中a代码节点和b代码节点->c代码节点,因为c代码节点的输入数据来自a代码节点和b代码节点的输出数;假设c代码节点的输出数据不一一对应输入数据。例如,c代码节点的输入数据为姓名、年龄,输出数据为姓名+年龄,因为输出数据一一对应输入数据,所以可以确定c代码节点与a、b代码节点之间为映射依赖。
打乱依赖:代码节点的输入数据至少来自两个上一级代码节点的输出数据,并且该代码节点的输出数据不一一对应输入数据;定义代码节点与多个上一级代码节点之间为打乱依赖。如图3中a代码节点和b代码节点->c代码节点,因为c代码节点的输入数据来自a代码节点和b代码节点的输出数;假设c代码节点的输出数据一一对应输入数据。例如,c代码节点的输入数据为员工考勤(记录了工号和考勤情况的对应关系)和员工信息(记录了姓名和工号的对应关系);输出数据为姓名+考勤,因为需要将两个输入数据结合才可以得到姓名+考勤的输出数据,所以可以确定为c代码节点与a、b代码节点之间为打乱依赖。
通过上述三种情况中的任意一种或者组合,都可以实现持久化代码节点的输出数据,从而供后续代码节点发生异常时获取持久化数据。
如上所述持久化的过程中,对于流依赖、映射依赖和打乱依赖的代码节点均进行持久化处理。在实际应用中,如果代码较为复杂或者涉及到的数据量较多的情况下,可能会出现持久化数据过多导致存储空间不足的问题,特别是当持久化数据存储在内存中时,那么内存不足会直接影响代码执行效率。通常,由于流依赖的代码节点处理数据相对简单,所以不需要对每个流依赖的代码节点的输出数据进行持久化,例如某一个流依赖的代码节点仅对数据进行传递时,完全不需要进行持久化。
针对第一种方式,为了解决上述问题,在一种可选的实施例中:
确定代码节点与前一级代码节点之间为流依赖的情况下,输出配置接口给用户,以使得用户可以对该代码节点设置持久化标识,当然用户也可以对该代码节点不设置持久化标识,所以这里只是给用户增加了一个选项。
在代码节点具有持久化标识的情况下,该代码节点的输出数据需要被持久化。
通过本实施例,对于流依赖的代码节点,在具有持久化标识的情况下会进行持久化处理,在没有持久化标识的情况下不用进行持久化处理。如此可以减少持久化数据的产生避免持久化数据过多导致存储空间不足。
类似地,在实际应用中,由于映射依赖的代码节点处理数据也相对简单,所以并不一定需要对每个映射依赖的代码节点的输出数据进行持久化。为了防止存储持久化数据的存储空间不足,针对第二种方式,在一种可选的实施例中:
确定代码节点与前一级代码节点之间为映射依赖的情况下,输出配置接口给用户,以使得用户可以对该代码节点设置持久化标识,当然用户也可以对该代码节点不设置持久化标识,所以这里只是给用户增加了一个选项。
在代码节点具有持久化标识的情况下,该代码节点的输出数据需要被持久化。
通过本实施例,对于映射依赖的代码节点,在具有持久化标识的情况下会进行持久化处理,在没有持久化标识的情况下不用进行持久化处理。如此可以减少持久化数据的产生避免持久化太多数据过多导致存储空间不足。
如上流依赖或者映射依赖的实施例中,在所述判断所述代码节点是否具有持久化标识之后,所述方法还包括:
在所述代码节点不具有持久化标识的情况下,判断所述代码节点是否为最后一个代码节点;
在所述代码节点为最后一个代码节点的情况下,持久化所述代码节点的输出数据。
本实施例中,对于流依赖或者映射依赖的代码节点,如果该代码节点不具有持久化标识,代码执行设备进一步可以判断是否为最后一个代码节点;如果是最后一个代码节点,则持久化所述代码节点的输出数据。也就是说,即使最后一个代码节点没有人为预设的持久化标识,所述代码执行设备也需要持久化最后一个代码节点的输出数据。
通过本实施例,默认持久化最后一个代码的输出数据,如果发生输出数据丢失的情况,可以快速获取最后一个代码节点的持久化数据。
步骤120:获取该持久化代码节点的持久化数据。
本实施例中,通过步骤110中确定的持久化代码节点,就可以获取该持久化代码节点的持久化数据。
步骤130:以所获取的持久化数据作为输入数据,从所确定的持久化代码节点后一个代码节点开始执行。
本实施例中,代码执行设备在确定了距离所述代码节点最近的持久化代码节点及获取了该持久化代码节点的持久化数据之后,可以以所获取的持久化数据作为输入数据,从所确定的持久化代码节点后一个代码节点开始执行。
沿用上一步骤中的例子加以说明,在获取持久化代码节点c代码节点的持久化数据后,可以以该获取的持久化数据作为输入数据,从所述持久化代码节点c代码节点后一个代码节点即d代码节点开始执行。
通过本实施例,在代码执行过程中,通过对持久化代码节点的输出数据进行持久化处理,如此在后续代码节点出现异常后,可以获取距离所述代码节点最近的持久化代码节点的持久化数据,以所述持久化数据作为输入数据,从所述持久化代码节点后一个代码节点开始执行。应用本申请实施例中,在代码执行过程中代码节点出现异常后,无需从头开始执行,从而提高了代码执行的效率。而且,随着涉及到的数据量的增加,特别是大数据处理时,从头开始执行不仅极大的消耗系统资源还可能会出现代码不可执行的情况,应用本实施例就可以减少系统资源的消耗,避免了代码不可执行的情况。
参见图5,为本申请一实施例提供的代码执行方法的流程图,所述方法可以包括以下步骤:
步骤210:根据预设规则对待执行的代码进行解析,从而得到所述代码中每一个代码节点所属的依赖关系,所述依赖关系包括流依赖、映射依赖和打乱依赖。
本实施例中,所述预设规则包括:
在代码节点的输入数据只来自一个上一级代码节点的输出数据的情况下,确定所述代码节点属于流依赖;
在代码节点的输入数据至少来自两个上一级代码节点的输出数据,并且该代码节点的输出数据一一对应输入数据的情况下,确定所述代码节点属于映射依赖;
在代码节点的输入数据至少来自两个上一级代码节点的输出数据,并且该代码节点的输出数据不一一对应输入数据的情况下,确定所述代码节点属于打乱依赖。
以下举例说明,某待执行的代码,根据预设规则对其进行解析后可以得到如图4所示的代码节点拓扑图,这里详细说下解析过程:
首先,根据代码节点的运行逻辑:首先执行a代码节点;之后,执行b、c代码节点;之后,执行d、e代码节点;之后,执行f代码节点;最后执行h代码节点。根据预设规则,确定b代码节点属于流依赖:确定d代码节点属于打乱依赖;确定f代码节点属于映射依赖;确定h代码节点属于流依赖。由于a、c、e代码节点属于初始代码节点不属于任何依赖。
步骤220:在执行每一个代码节点后,判断该代码节点是否为持久化代码节点。
本实施例中,所述持久化代码节点包括属于打乱依赖的代码节点。
具体地,在所述代码节点属于打乱依赖的情况下,执行步骤230。
本实施例中,在代码执行时,所述代码执行设备通过判断所述代码节点是否属于打乱依赖,在确定所述代码节点属于打乱依赖的情况下,持久化所述代码节点的输出数据。
在一个可选的实施例中,所述持久化节点还可以是具有预设的持久化标识的代码节点。
具体地,在所述代码节点具有预设的持久化标识的情况下,执行步骤230。
本实施例中,用户可以人为预先对代码节点配置持久化标识,例如某个代码节点处理数据比较复杂,输出数据比较重要,那么用户就可以对该代码节点配置一个持久化标识;当然用户也可以对该代码节点不设置持久化标识,这里只是给用户增加了一个选项。如此,在代码执行时,所述代码执行设备通过判断所述代码节点是否具有持久化标识,在确定所述代码节点具有持久化标识的情况下,持久化所述代码节点的输出数据。
在一个可选的实施例中,所述持久化节点还可以是最后一个的代码节点。
具体地,在所述代码节点为最后一个代码节点的情况下,执行步骤230。
本实施例中,代码执行设备还可以判断所述代码节点是否为最后一个代码节点,在所述代码节点为最后一个代码节点的情况下,持久化所述代码节点的输出数据。
步骤230:如果是,则持久化该代码节点的输出数据。
通过本实施例,在代码执行过程中,通过对持久化代码节点的输出数据进行持久化处理,用于前述代码异常处理的实施例,即在后续代码节点出现异常后,获取距离所述代码节点最近的持久化代码节点的持久化数据,以所述持久化数据作为输入数据,从所述持久化代码节点后一个代码节点开始执行。
以下结合图4所示的一个代码节点拓扑图加以说明,其中,包括a代码节点、b代码节点、c代码节点、d代码节点、e代码节点、f代码节点及h代码节点。
假设a代码节点的输入数据为Assembly1;b代码节点的输入数据为Assembly2;c代码节点的输入数据为Assembly3。
开始执行代码,执行a代码节点(对输入数据Assembly1进行处理后输出数据Assembly1’);
a代码节点执行完毕后,由于b代码节点与a代码节点之间为流依赖,执行b代码节点(对输入数据Assembly1’进行处理后输出数据Assembly1”);
b代码节点执行完毕后,由于d代码节点与b代码节点、c代码节点之间为打乱依赖,等待c代码节点执行完毕;
执行c代码节点(对输入数据Assembly2进行处理后输出数据Assembly2’);
b代码节点、c代码节点都执行完毕后,执行d代码节点(对输入数据Assembly1”及Assembly2’进行处理后输出数据Assembly1”2’),由于d代码节点属于打乱依赖,持久化输出数据Assembly1”2’;
d代码节点执行完毕后,由于f代码节点与d代码节点、e代码节点之间为映射依赖,等待e代码节点执行完毕;
执行e代码节点(对输入数据Assembly3进行处理后输出Assembly3’);
d代码节点、e代码节点都执行完毕后,执行f代码节点(对输入数据Assembly1”2’及Assembly3’进行处理后输出数据Assembly1”2’3’);
f代码节点执行完毕后,由于h代码节点与f代码节点之间为流依赖,执行h代码节点(对输入数据Assembly1”2’3’进行处理后输出数据Assembly),并且由于h代码节点是结束代码节点,持久化h代码节点的输出数据Assembly,所述代码执行完毕。
假设执行到h代码节点时出现异常,那么代码执行设备只需获取距离h代码节点最近的持久化代码节点即d代码节点的持久化数据Assembly1”2’;以所述持久化数据Assembly1”2’作为输入数据,从d代码节点后一个代码节点即f代码节点开始执行。
假设f代码节点具有持久化标识,那么持久化输出数据Assembly1”2’3’;如此在h代码节点出现异常后,代码执行设备只需获取距离h代码节点最近的持久化代码节点即f代码节点的持久化数据Assembly1”2’3’;以所述持久化数据Assembly1”2’3’作为输入数据,从f代码节点后一个代码节点即h代码节点开始执行。
与前述代码异常处理方法实施例相对应,本申请还提供了代码异常处理装置的实施例。
本申请代码异常处理装置的实施例可以分别应用在代码执行设备上。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在设备的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,如图6所示,为本申请代码异常处理装置所在设备的一种硬件结构图,除了图6所示的处理器、网络接口、内存以及非易失性存储器之外,实施例中装置所在的设备通常根据该代码异常处理的实际功能,还可以包括其他硬件,对此不再赘述。
参见图7,为本申请一实施例提供的代码异常处理装置的模块图,所述装置包括:确定单元300、获取单元310和执行单元320。
其中,所述确定单元300,在代码节点出现异常后,确定与该代码节点距离最近的持久化代码节点;其中,所述持久化代码节点为具有持久化数据的代码节点;
所述获取单元310,获取该持久化代码节点的持久化数据;
所述执行单元320,以所获取的持久化数据作为输入数据,从所确定的持久化代码节点后一个代码节点开始执行。
在一个可选的实现方式中:
所述持久化数据通过如下方式中的至少一种生成:
第一持久化单元,确定代码节点与前一级代码节点之间为流依赖的情况下,持久化所述代码节点的输出数据;其中,所述流依赖是代码节点的输入数据只来自一个上一级代码节点的输出数据;
第二持久化单元,确定代码节点与前一级代码节点之间为映射依赖的情况下,持久化所述代码节点的输出数据;其中,所述映射依赖是代码节点的输入数据至少来自两个上一级代码节点的输出数据,并且该代码节点的输出数据一一对应输入数据;
第三持久化单元,确定代码节点与前一级代码节点之间为打乱依赖的情况下,持久化所述代码节点的输出数据;其中,所述打乱依赖是代码节点的输入数据至少来自两个上一级代码节点的输出数据,并且该代码节点的输出数据不一一对应输入数据。
在一个可选的实现方式中:
所述持久化数据通过如下方式生成:
第四持久化单元,确定代码节点具有持久化标识的情况下,持久化所述代码节点的输出数据。
在一个可选的实现方式中:
所述持久化数据通过如下方式生成:
第五持久化单元,确定代码节点为最后一个代码节点的情况下,持久化所述代码节点的输出数据。
与前述代码执行方法实施例相对应,本申请还提供了代码执行装置的实施例。
本申请代码执行装置的实施例可以分别应用在代码执行设备上。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在设备的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,如图8所示,为本申请代码执行装置所在设备的一种硬件结构图,除了图8所示的处理器、网络接口、内存以及非易失性存储器之外,实施例中装置所在的设备通常根据该代码执行的实际功能,还可以包括其他硬件,对此不再赘述。
参见图9,为本申请一实施例提供的代码执行装置的模块图,所述装置包括:解析单元400、判断单元310和持久化单元320。
其中,所述解析单元400,根据预设规则对待执行的代码进行解析,从而得到所述代码中每一个代码节点所属的依赖关系,所述依赖关系包括流依赖、映射依赖和打乱依赖;
所述判断单元410,在执行每一个代码节点后,判断该代码节点是否为持久化代码节点;
所述持久化单元420,在该代码节点要进行持久化处理的情况下,持久化该代码节点的输出数据。
在一个可选的实现方式中:
所述预设规则包括:
在代码节点的输入数据只来自一个上一级代码节点的输出数据的情况下,确定所述代码节点属于流依赖;
在代码节点的输入数据至少来自两个上一级代码节点的输出数据,并且该代码节点的输出数据一一对应输入数据的情况下,确定所述代码节点属于映射依赖;
在代码节点的输入数据至少来自两个上一级代码节点的输出数据,并且该代码节点的输出数据不一一对应输入数据的情况下,确定所述代码节点属于打乱依赖。
在一个可选的实现方式中:
所述持久化代码节点包括属于打乱依赖的代码节点;
或者,
具有预设的持久化标识的代码节点;
或者,
最后一个的代码节点。
通过本实施例,在代码执行过程中,通过对持久化代码节点的输出数据进行持久化处理,如此在后续代码节点出现异常后,可以获取距离当前代码节点最近的持久化代码节点的持久化数据,以所述持久化数据作为输入数据,从所述持久化代码节点后一个代码节点开始执行。应用本申请实施例中,在代码执行过程中代码节点出现异常时,无需从头开始执行,从而提高了代码执行的效率。而且,随着涉及到的数据量的增加,特别是大数据处理时,从头开始执行不仅极大的消耗系统资源还可能会出现代码不可执行的情况,应用本实施例就可以减少系统资源的消耗,避免了代码不可执行的情况。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求指出。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制。