首页 / 方面感知流计算

方面感知流计算实质审查 发明

技术内容

方面感知流计算 背景技术 [0001] 本公开涉及流计算,并且更具体地,涉及基于方面程序代码来影响流应用的操作。 [0002] 可以利用流计算来提供对大量数据的实时分析处理。流计算可以基于预编译的固定的处理元件或流操作器集合。 发明内容 [0003] 根据实施例,所公开的是一种方法、系统和计算机程序产品。 [0004] 可以监测元组流。元组流由在流应用的一个或多个计算节点上操作的多个处理元件处理,每个处理元件具有一个或多个流操作器。接收用于执行第一一个或多个程序代码指令的集合的程序请求。基于该程序请求来标识第一程序代码指令集合的流应用目标。利用通用程序执行结构封装流应用的一个或多个部分的集合的第一部分。封装是在流应用的操作期间进行的。通用程序执行结构被配置为接收并执行流应用的预配置操作之外的程序代码指令。第一程序代码指令集合由通用程序执行结构在流应用的第一部分的执行的第一时间段执行。第一程序代码指令集合的执行是响应于程序请求、基于流应用目标并且在流应用的操作期间。 [0005] 上面的发明内容并非旨在描述本公开的每个所示实施例或每种实施方式。 附图说明 [0006] 包括在本申请中的附图并入说明书中并形成说明书的一部分。它们示出了本公开的实施例,并且与说明书一起用于解释本公开的原理。附图仅说明某些实施例,而不限制本公开。 [0007] 图1描绘了根据本公开的一些实施例的可以使用的示例计算机系统的代表性主要组件; [0008] 图2描绘了与本公开的一些实施例一致的被配置为对元组流进行操作的示例流计算应用; [0009] 图3是与本公开的一些实施例一致的被配置为方面感知流计算的示例流应用;以及 [0010] 图4描绘了根据本公开的一些实施例的执行方面感知流计算的方法。 [0011] 虽然本发明可以有各种修改和替换形式,但是其细节已经在附图中通过示例的方式示出并且将被详细描述。然而,应当理解的是,其目的不是将本发明限制于所描述的特定实施例。相反,本发明覆盖落入本发明的精神和范围内的所有修改、等效和替换。 具体实施方式 [0012] 本公开的各方面涉及流计算,并且更具体地,各方面涉及基于方面程序代码来影响流应用的操作。虽然本公开不一定限于这样的应用,但是通过使用该上下文的各种示例的讨论可以理解本公开的各个方面。 [0013] 计算系统(备选地,计算机系统)的用途之一是收集可用信息、处理所收集的信息、以及基于所处理的信息作出决策。计算机系统可以通过数据库的方式对信息进行操作,该数据库允许用户确定发生了什么并且基于过去的事件对未来结果进行预测。这些计算机系统可以从各种源接收信息,然后将信息记录到永久数据库中。在信息已经被记录在数据库中之后,计算系统可以对信息运行算法—有时生成新信息并且然后对新信息执行相关联的变换并且存储新信息—以做出确定并且向用户提供上下文。 [0014] 计算机系统分析信息并向用户提供含义的能力在一些情况下可能是不够的。诸如公司和政府之类的大型组织基于信息分析来作出决策的能力可能因可用信息的有限范围而受到损害。此外,该分析可能具有有限的价值,因为它依赖于可能包含过时信息的所存储的结构数据库。这可能导致具有有限值的决策,或者在一些情况下,导致不准确的决策。例如,天气预报服务可能无法准确地预测给定区域的降水,或者股票经纪公司可能做出关于股票交易趋势的错误决策。 [0015] 计算机系统的分析缺点可能被其它因素所加重。首先,世界可能变得越来越物联化,因为先前的非智能设备现在正变成智能设备。智能设备可以包括历史上无法提供分析信息但添加了传感器的设备,现在可以这样做(例如,现在能够向其所有者或制造商提供诊断信息的汽车、现在经由网页向用户传达关于家中的日常温度波动的信息的恒温器)。其次,这些缺点也可能由于来自信息源的通信的增加而增加,因为先前隔离的设备现在正在变得互连(例如,家庭内的电器彼此通信并且与电力公司通信以更有效地利用电力)。这些新的信息源不仅可以提供孤立数据点的量,而且可以提供新的智能设备之间的关系。 [0016] 第三个复合因素是计算系统的用户可能更喜欢连续分析信息流,而数据获取的方法可能仅提供分析预先记录的信息的基于事件的方法。例如,分析包可以接收有限量的数据,并且稍后对该数据应用分析。当处理连续的数据流时,这种方法可能不起作用。第四个复合因素是计算机系统在处理大量信息以及处理信息的非结构化性质方面可能具有缺陷; 例如,传感器、相机和其他新数据源可能不提供上下文或格式,而仅提供原始信息。计算系统的分析方法可能需要修改和重新排列该数据,以便提供用于原始信息的任何种类的上下文。修改和重新安排可能花费许多计算系统可能无法提供的时间或资源。 [0017] 另一个潜在的缺点是计算系统可能无法向新用户提供可扩展的解决方案。智能和连接设备的出现为分析连续信息流提供了新的用例。然而,大规模数据收集的现代系统可能需要大量的用户训练并提供非直观的界面。例如,农场主可以使农场上的每个动物都装备有传感器以监测动物的健康和位置。来自这些传感器的数据可以使农场主能够对动物的不断变化的健康状况做出响应,但是只有在传感器数据被收集并被转换成可用的格式以实时地向农场主提供有意义的信息的情况下。农夫可能没有资源提供给技术专家来构建大规模分析包,并且所获得的信息可能未被使用。 [0018] 图1描绘了根据本公开的一些实施例的可以使用的示例计算机系统100(备选地,计算机)的代表性主要组件。应当理解的是,各个组件可以在复杂性、数量、类型和/或配置上变化。所公开的特定示例仅用于示例目的,而不一定是仅有的这种变型。计算机系统100可以包括处理器110、存储器120、输入/输出接口(在本文中,I/O或I/O接口)130和主总线 140。主总线140可以为计算机系统100的其他组件提供通信路径。在一些实施例中,主总线 140可以连接到其它组件,诸如专用数字信号处理器(未描绘)。 [0019] 计算机系统100的处理器110可以包括一个或多个核112A、112B、112C、112D(被统称为112)。处理器110可以另外包括一个或多个存储器缓冲器或高速缓存(未示出),其为核 112提供指令和数据的临时存储。核112可以对从高速缓存或从存储器120提供的输入执行指令,并且将结果输出到高速缓存或存储器。核112可以由被配置为执行根据本发明的实施例的一个或多个方法的一个或多个电路组成。在一些实施例中,计算机系统100可以包含多个处理器110。在一些实施例中,计算机系统100可以是具有单个核112的单个处理器110。 [0020] 计算机系统100的存储器120可以包括存储器控制器122。在一些实施例中,存储器 120可以包括用于存储数据和程序的随机存取半导体存储器、存储设备或存储介质(易失性或非易失性)。在一些实施例中,存储器可以是模块的形式(例如,双列直插式存储器模块)。 存储器控制器122可以与处理器110通信,从而促进存储器120中的信息的存储和检索。存储器控制器122可以与I/O接口130通信,从而促进存储器120中的输入或输出的存储和检索。 [0021] I/O接口130可以包括I/O总线150、终端接口152、存储接口154、I/O设备接口156和网络接口158。I/O接口130可以将主总线140连接到I/O总线150。I/O接口130可以将来自处理器110和存储器120的指令和数据引导至I/O总线150的各种接口。I/O接口130还可以将指令和数据从I/O总线150的各种接口引导到处理器110和存储器120。各种接口可以包括终端接口152、存储接口154、I/O设备接口156和网络接口158。在一些实施例中,各种接口可以包括上述接口的子集(例如,工业应用中的嵌入式计算机系统可以不包括终端接口152和存储接口154)。 [0022] 整个计算机系统100中的逻辑模块—包括但不限于存储器120、处理器110和I/O接口130—可以将一个或多个组件的故障和改变传达给管理程序或操作系统(未描绘)。管理程序或操作系统可以分配计算机系统100中可用的各种资源,并且跟踪存储器120中的数据的位置以及分配给各个核112的进程的位置。在组合或重新布置元件的实施例中,可以组合或重新分布逻辑模块的方面和能力。这些变化对于本领域技术人员是显而易见的。 [0023] I.流计算 [0024] 流计算可允许用户处理大数据,并且在大数据由各种源生成时连续地提供对该大数据的高级度量。流应用可以通过生成一个或多个处理元件的配置来提供流计算,每个处理元件包含一个或多个流操作器。例如,流应用可以利用包含在每个处理元件和/或流操作器中的固定逻辑来编译。流应用的每个处理元件和/或流操作器可以通过生成和修改元组的形式的信息来处理大数据。每个元组可以具有一个或多个属性(例如,元组可以类似于表中的行,并且属性类似于表中的列)。 [0025] 流应用可以将配置的实例部署到硬件计算节点集合。流应用然后可以通过调整硬件以在其被配置时执行流应用来管理实例,诸如通过将处理元件负载平衡到计算节点上、给定计算节点的一部分上或跨多个计算节点。 [0026] 图2描绘了与本公开的一些实施例一致的被配置为对元组流进行操作的示例流计算应用(流应用)200。流应用200可以以操作器图形202的形式来表示。操作器图形202可以向用户可视地表示通过流应用200的数据流。操作器图形202可以定义元组如何被路由通过流应用200的各种组件(例如,执行路径、图2中由弯曲箭头线表示的处理和资源分配的预编译逻辑布局)。流应用200可以包括一个或多个计算节点210‑1、210‑2、210‑3和210‑4(被统称为210);开发系统220;管理系统230;一个或多个处理元件240‑1、240‑2、240‑3、240‑4、 240‑5和240‑6(被统称为240);一个或多个流操作器242‑1、242‑2、242‑3、242‑4、242‑5、 242‑6、242‑7(被统称为242);以及网络250。 [0027] 流应用200可以从一个或多个源244接收信息。流应用200可以向一个或多个宿246输出信息。输入可以来自流应用200的外部,诸如来自多个物联网(IoT)设备。流网络250可以是处理流应用200的各部分之间的连接、发送和接收数据的通信层。例如,流网络250可以是流应用200内部的数据分组的传输层,并且被配置为通信地耦接处理元件240。 [0028] 操作器图形202所描绘的流应用200的配置只是示例流应用。流应用可以在计算节点、处理元件或流操作器的数目上变化。流应用还可以改变由任何组件执行的角色和/或责任,或者可以包括未描绘的其他组件。例如,开发系统220的功能的一些或全部可以由管理系统230执行。在另一示例中,开发系统220和管理系统230的功能可以由单个管理系统(未描绘)执行。管理系统可以被配置为执行这些任务而不偏离本文中所公开的实施例。在又一示例中,开发系统220和管理系统230的功能可以由多个服务(例如,十个或更多个单独的软件程序,每个软件程序被配置为执行特定功能)执行。 [0029] 计算节点210可以是计算机系统,并且可以各自包括以下组件:处理器、存储器和输入/输出接口(在本文中,I/O)。每个计算节点210还可以包括操作系统或管理程序。在一些实施例中,计算节点210可以执行用于开发系统220、管理系统230、处理元件240和/或流操作器242的操作。计算节点210可以被分类为管理主机、应用主机或混用主机。管理主机可以执行开发系统220和/或管理系统230的操作。应用主机可以执行用于处理元件240和流操作器242的操作。混用主机可以执行管理主机和应用主机两者的操作。图1描绘了可以是与一些实施例一致的计算节点的计算机系统100。 [0030] 网络(未示出)可以将每个节点210相互耦接在一起(例如,局域网、因特网等)。例如,节点210‑1可以通过网络与节点210‑2、210‑3和210‑4通信。计算节点210可以通过I/O与网络通信,网络可以包括各种物理通信信道或链路。链路可以是有线、无线、光或任何其它合适的介质。网络可以包括用于执行路由、交换和其他功能的各种网络硬件和软件,例如路由器、交换机或网桥。节点210可以通过各种协议(例如,因特网协议、传输控制协议、文件传输协议、超文本传输协议等)通信。在一些实施例中,节点210可以与其他硬件、软件或服务(未示出)共享网络。 [0031] 开发系统220可以向用户提供创建目标为处理特定数据集的流应用的能力。开发系统220可以在诸如计算机系统100等计算机系统(未示出)的实例上操作。开发系统220可以在计算节点210中的一个或多个上操作。开发系统220可以生成描述流计算应用200的一个或多个配置文件(例如,处理元件240、流操作器242、源244、宿246、上述计算节点210的分配等)。开发系统220可以从用户接收生成流应用200的请求。开发系统220可以从用户接收生成其它流应用(未描绘)的请求。开发系统220可以与管理系统230通信以传递开发系统 220可以创建的任何流应用上的配置。 [0032] 开发系统220可以通过考虑软件组件(例如,处理元件240、流操作子242等)、硬件(例如,计算节点210、网络)和数据(例如,源244、元组的格式等)的性能特性来生成配置。在第一示例中,开发系统220可以确定在计算节点210‑1上一起运行处理元件240‑1、240‑2和 240‑3的开销导致比在单独的计算节点上运行它们更好的性能。在第二示例中,开发系统 220可以确定将流操作器242‑3、242‑4、242‑5和242‑6放置到单个处理单元240‑5中的存储器占用量大于计算节点210‑2中的第一处理器的高速缓存,为了在第一处理器的高速缓存内保留存储器空间,开发系统220可以决定仅将流操作器242‑4、242‑5和242‑6放置到单个处理单元240‑5中,而不管具有两个处理单元240‑4和240‑5的进程间通信等待时间。 [0033] 在考虑性能特性的第三示例中,开发系统220可以标识需要流应用200的更大量资源的第一操作(例如,在计算节点210‑3上的处理元件240‑6上执行的操作)。开发系统220可以分配更大量的资源(例如,除计算节点210‑3之外还操作计算节点210‑4上的处理元件 240‑6)以帮助第一操作的执行。开发系统220可以标识在流应用200内需要较少量资源的第二操作(例如,在处理元件240‑1上执行的操作)。开发系统220还可以确定流应用200可以通过并行化的增加(例如,处理元件240‑1的更多实例)而更高效地操作。开发系统220可以创建处理元件240‑1的多个实例(例如,处理元件240‑2和240‑3)。开发系统220然后可将处理元件240‑1、240‑2和240‑3分配给单个资源(例如,计算节点210‑1)。最后,开发系统220可以标识第三操作和第四操作(例如,在处理元件240‑4和240‑5上执行的操作),其每一个都需要低级资源。开发系统220可以向两个不同的操作分配较少量的资源(例如,使它们共享计算节点210‑2的资源,而不是在其自己的计算节点上执行每个操作)。 [0034] 开发系统220可以包括编译模块(例如,处理元件240、流操作器242等)的编译器(未示出)。模块可以是源代码或其他程序语句。模块可以是来自流处理语言(例如,包含允许用户从以特定方式格式化的信息陈述特定子集的声明性语句的计算语言)的请求的形式。编译器可以将模块转换成目标代码(例如,以计算节点210的特定指令集合架构为目标的机器代码)。编译器可以将模块转换成中间形式(例如,虚拟机代码)。编译器可以是作为解释器的一部分执行的即时编译器。在一些实施例中,编译器可以是优化编译器。在一些实施例中,编译器可执行窥孔优化、局部优化、循环优化、过程间或整体程序优化、机器代码优化、或减少执行对象代码所需的时间量、减少执行对象代码所需的存储器量、或两者的任何其它优化。 [0035] 管理系统230可以监测和管理流应用200。管理系统230可以在计算机系统(未示出)的实例上操作,诸如计算机系统100。管理系统230可以在一个或多个计算节点210上操作。管理系统230还可以提供流应用200的操作器图形202。管理系统230可以托管构成流应用200的服务(例如,监测计算节点210的健康、处理元件240和流操作器242的性能等的服务)。管理系统230可以从用户接收请求(例如,用于认证和授权流应用210的用户的请求、用于查看由流应用生成的信息的请求、用于查看操作器图形202的请求等)。 [0036] 管理系统230可以向用户提供创建由开发系统220配置的流应用200的多个实例的能力。例如,如果需要流应用200的第二实例执行相同的处理,则管理系统230可以分配第二计算节点集合(未描绘)用于执行流应用的第二实例。管理系统230还可重新分配计算节点 210以减轻系统中的瓶颈。例如,如图所示,处理元件240‑4和240‑5由计算节点210‑2执行,处理元件240‑6由计算节点210‑3和210‑4执行,在一种情况下,流应用200可能经历性能问题,因为处理元件240‑4和240‑5在处理元件240‑6进入空闲状态之前没有向处理元件240‑6提供元组。管理系统230可以检测这些性能问题,并且可以重新分配来自计算节点210‑4的资源以执行处理元件240‑4的一部分或全部,从而减少计算节点210‑2上的工作负荷,管理系统230还可以执行计算节点210的操作系统的操作,例如处理元件240和流操作器242的负载平衡和资源分配。通过执行操作系统的操作,管理系统230可以使得流应用200能够更有效地使用可用硬件资源并且提高性能(例如,通过降低操作系统和计算节点210的多处理硬件的开销)。 [0037] 处理元件240可以执行流应用200的操作。每个处理元件240可以在一个或多个计算节点210上操作。在一些实施例中,给定处理元件240可以对给定计算节点210的子集进行操作,诸如计算节点210的处理器或处理器的单个核。在一些实施例中,给定处理元件240可以对应于由计算节点210托管的操作系统进程。在一些实施例中,给定处理元件240可以在多个计算节点210上操作。处理元件240可以由开发系统220生成。每个处理元件240可以是二进制文件和附加库文件(例如,可执行文件和关联库、包含可执行代码和关联资源的包文件等)的形式。 [0038] 处理元件240中的每个处理元件可以包括来自开发系统220或管理系统230的配置信息(例如,其被分配到的相关计算节点210所需的资源和约定、与源244或宿246通信所需的身份和凭证、以及与其他处理元件通信所需的身份和凭证等)。每个处理元件240可以被开发系统220配置为在计算节点210之一上最优地运行。例如,处理元件240‑1、240‑2和240‑ 3可以被编译为利用由在计算节点210‑1上运行的操作系统标识的优化运行,还可以针对计算节点210‑1的特定硬件(例如,指令集合架构、诸如存储器和处理器之类的配置资源等)优化处理元件240‑1、240‑2和240‑3。 [0039] 每个处理元件240可以包括一个或多个流操作器242,其执行流应用200的基本功能。当元组流按照操作器图形202的指示流过处理元件240时,它们从一个流操作器传递到另一个流操作器(例如,第一处理元件可以处理元组并且将处理后的元组放置在分配给第二处理元件的队列中,第一流操作器可以处理元组并且将处理后的元组写入到指定给第二流操作器的存储器区域,处理后的元组可以不被移动,但是可以利用元数据更新,以表示它们准备好由新的处理元件或流操作器处理,等等)。同一处理元件240内的多个流操作器242可以受益于架构效率(例如,减少的高速缓存未命中、共享的变量和逻辑、减少的存储器交换等)。处理元件240和流操作器242可以利用进程间通信(例如,网络套接字、共享存储器、消息队列、消息传递、信号量等)。处理元件240和流操作器242可以根据流应用200的配置利用不同的进程间通信技术。例如:流操作器242‑1可以使用信号量来与流操作器242‑2通信; 处理元件240‑1可以使用消息QUE与处理元件240‑3通信;并且处理元件240‑2可以使用网络套接字来与处理元件240‑4通信。 [0040] 流操作器242可以执行流应用200的基本逻辑和操作(例如,处理元组并且将处理的元组传递到流应用的其它组件)。通过将可以在单个较大程序内发生的逻辑分离成由流操作器242执行的基本操作,流应用200可以提供更大的可扩展性。例如,在给定的流应用中托管数百个流操作器的数十个计算节点可以使得能够每秒处理数百万个元组。该逻辑可以在流应用200的运行时之前由开发系统220创建。在一些实施例中,源244和宿246还可以是流操作器242。在一些实施例中,源244和宿246可以将多个流应用链接在一起(例如,源244可以是用于第二流应用的宿,并且宿246可以是用于第三流应用的源)。流操作器242可以被开发系统220配置为使用可用的计算节点210来最优地执行流应用200。流操作器242可以发送和接收来自其他流操作器的元组。流操作器242可以从源244接收元组,并且可以将元组发送到宿246。 [0041] 流操作器242可以对元组的属性执行操作(例如,条件逻辑、迭代循环结构、类型转换、字符串格式化、过滤语句等)。在一些实施例中,每个流操作器242可以仅执行非常简单的操作,并且可以将更新的元组传递到流应用200中的另一个流操作器—简单的流操作器可以是更可缩放的并且更容易并行化。例如,流操作器242‑2可以接收特定精度的日期值,并且可以将日期值舍入到较低精度,并且将更改的日期值传递到流操作器242‑4,其可以将更改的日期值从24小时格式改变为12小时格式。给定的流操作器242可以不改变关于元组的任何内容。流操作器242可以通过添加新的属性或移除现有属性来对元组执行操作。 [0042] 流操作器242可以通过将一些元组路由到第一流操作器并且将其它元组路由到第二流操作器来对元组流执行操作(例如,流操作器242‑2将一些元组发送到流操作器242‑3并且将其它元组发送到流操作器242‑4)。流操作器242可以通过过滤一些元组(例如,剔除一些元组并且将流的子集传递到另一个流操作器)来对元组流执行操作。流操作器242还可以通过将流中的一些路由到其自身来对元组流执行操作(例如,流操作器242‑4可以执行简单的算术操作,并且作为其操作的一部分,其可以执行逻辑循环并且将元组的子集引导到其自身)。在一些实施例中,由流操作器242或处理元件240输出的特定元组可以不被认为是与对应的输入元组相同的元组,即使流操作器或处理元件不改变输入元组。 [0043] 在一些情况下,流应用可以主要是静态大数据操作机制。这样的流应用一旦被配置,就可能在其提供给用户的上下文中是不可改变的。例如,在开发操作器图形202之后,开发系统220可以将具有流应用200的配置的操作器图形的生成形式提供给管理系统230,以供计算节点210执行。此外,在一些情况下,这样的流应用执行关于它如何处理元组的某些逻辑。一旦被配置,该逻辑可能是不可更新的或可改变的,直到新的流应用被编译。由于流应用和信息流应用处理的实时连续性质,试图向这种配置的流实例的处理元件或流操作器提供更新可能是不切实际的。例如,任何停机时间,甚至在微秒内,可以使得流应用在从原始配置的处理元件到更新的处理元件的转换期间不收集一个或多个元组。丢失一部分数据可能导致流应用的部分或完全故障,并且流应用可能无法向用户提供到大数据源的上下文。 [0044] 当太多或太少的数据流过流应用程序时,可能发生另一个问题。例如,给定流操作器中的逻辑可以提供仅处理元组的子集、选择或部分的流应用。如果基于流操作器的配置处理太少的元组,则可能导致差的分析值,因为数据集太小而无法导出含义。为了补偿,预编译的流应用可以被配置为摄取和处理许多元组。如果基于流操作器的配置处理太多元组,则在系统中可能存在瓶颈(例如,处理器或存储器饥饿)。在其他实例中,一个或多个元组可以被丢弃,因为流应用的一部分被淹没(例如,当接收到大量元组时,一个或多个计算节点可以不处理某些元组)。例如,当太多数据(太多元组)泛洪流应用时,随机元组可能被丢弃,或者系统变得堵车并且崩溃。 [0045] 流应用的非优化配置可以基于无故障或不良意图,而是由于实际考虑。详细地,可以基于在流应用的开发阶段期间创建的测试数据的类型或量来生成给定流应用。由于大数据的分析是计算的相对新的阶段,可能难以预测或预知流应用中元组的处理的类型、量和最佳路线。例如,流应用200可以由开发系统220基于测试数据或基于处于不同条件集合下的源244来开发。结果是,开发系统220可以基于对数据处理的不完全或陈旧的理解来分配计算资源和数据流(如图2的曲线所表示的)。随着对情况的分析的发展,操作器图形202的配置可能不处理生产数据的实际问题,或者更新正在改变的真实世界事件或信息,并且因此影响来自源244的数据的类型和/或量。 [0046] 鉴于这些缺点中的一些,可能存在开发实时分析应用以解决许多不同因素的实际需要。第一个因素可以是在开发应用之前需要对好/坏数据格式、值等进行静态分析。可能需要静态分析的这种需要以适当地开发和配置数据分析系统。第二个因素可以是计划许多故障情况、源变化或关于数据的错误假设。例如,可以基于关于由源提供的数据的假设以及最佳地处理数据的方式来进行数据处理。假设可以帮助在编译、实例化和运行各种流操作器、处理元件以及它们之间的流程之前进行设计和配置;相同的假设可以在流应用的实际操作和运行时期间导致稍后的问题(例如,不正确的数据元组格式、数据元组值检查或配置和数据的其它未对准)。第三个因素可能是,由于各种原因可能需要重启数据分析或处理系统的一个或多个部分,以使得能够发生某些功能,或者改变给定系统的逻辑或辅助非核逻辑的配置。可以导致流应用重启的示例场景可以包括改变日志记录级别、执行增加的事务处理或者通过调整用于处理元组的条件(例如,元组的传递、添加或删除)来减轻资源瓶颈。 [0047] 减轻这些缺点的一种尝试可以是利用微服务架构。微服务架构可以尝试利用订阅数据流、执行某些功能、然后发布它们的小应用。微服务架构可以是不完整的或部分的解决方案。例如,流应用分析应用需要在部署和运行时之前知道和了解每个和所有潜在的订阅计划。流应用可能无法针对每种情况进行配置,并且作为不利,可能必须重新开始以重新配置或布置流的某些部分的输出(例如,处理元件或流操作器的输出)以校正这些缺陷)。 [0048] 减轻这些缺点的另一潜在尝试可以是作业覆盖体系结构。作业覆盖架构可以集中于确定对在运行的数据分析应用上执行某些编程逻辑的潜在需要,但是再次地,该特定架构对于流应用可能具有缺点。例如,作业覆盖架构可以集中于改变流应用的一部分的核逻辑(“作业逻辑”)的一部分,将新逻辑保存到应用包,并且将那些改变应用到运行部分。然而,这种解决方案没有解决可用性问题,因为它需要重启运行的进程来更新作业逻辑。例如,一旦流应用的一部分正在运行,则可以不对其进行更改。 [0049] ii.d.和ii.的组合。方面感知流计算 [0050] 方面感知流计算(“AASC”)可以克服与流应用的上下文中的其他类型的数据分析相关的问题。AASC可以使得流应用能够基于一个或多个面向方面的编程技术来操作。AASC可以包括暴露请求处理逻辑(“钩子”)以用于各方面的接收。挂钩可以是通用程序执行结构的形式。通用程序执行结构可以被配置为接收或使用由请求者提供的任意代码、规则或其他逻辑。AASC通过由通用程序执行结构执行,可以影响流应用的操作。具体地,可以发送包括一个或多个程序代码指令的集合的请求。该程序代码指令集合可以在元组流上并且在构建到流应用的流操作器和/或处理元件中的逻辑之外操作。 [0051] AASC可以被配置为影响流应用的核功能或第三功能。详细地,流应用可以具有在流应用的运行时和操作期间制定和操作的、在运行时之前开发的第一配置。通用程序执行结构可以在流应用的操作期间或流应用的操作之外执行。在第一示例中,通用程序执行结构可以恰在流应用的一部分之前和/或之后执行一程序代码指令集合。规则可以通过重新路由、更新、删除、添加或以其他方式修改流应用的一个或多个元组来更改流应用的功能。 [0052] 在一些实施例中,AASC可以通过封装流应用的一部分(例如,流操作器、处理元件)来操作。封装流应用的部分可以包含仅在构成部分的逻辑外部执行通用程序执行结构(其被配置为执行所接收的程序代码指令集合)的执行。例如,封装可以被配置为作为给定流操作器的一部分的任何代码之后的第一编程步骤或之前的最后编程步骤。封装流应用的部分可以包含执行通用程序执行结构的执行作为流应用的一部分的初始或终止步骤。例如,封装可以被配置为给定流操作器的第一编程步骤和/或最后编程步骤。 [0053] AASC可以在不影响流应用的可用性和执行的情况下操作。详细地,AASC不引起运行的应用的停机时间,并且基于预编译的逻辑执行的每个流操作器和处理元件的核逻辑不受影响或不被改变。例如,第一流操作器可以被配置为基于过滤语句或其他逻辑对元组操作,以仅影响元组流的某些元组,并且忽略或传递元组流的其他元组。通用程序执行结构可恰在流应用程序的原始经编译逻辑之前、之后、外部或与原始经编译逻辑分离地执行程序代码指令集。因此,仅改变流应用的影响(例如,元组的接收、更改、创建、删除和输出),而不更改核逻辑。 [0054] AASC可以提供优于其它流计算方法的优点。详细地,AASC可以促进能够执行各种功能的方面的快速或临时注入和/或移除,而不需要弹回、重新启动或以其他方式临时使流应用离线。AASC可以将其自身用于将方面连续传递到活动运行和预编译的流应用中。流应用通过AASC的这种可扩展性在流应用执行任务关键或其他基础设施操作的环境中可能是技术必要性。例如,发电站可以基于通过监测多个传感器的流应用来运行,传感器观测各种能量颗粒、化学混合物等。AASC还可以便于流应用的开发者和管理员调谐或固定流应用(例如,以处理改变的源数据,并且增加由流应用执行的计算的准确度)。可以在流应用的执行期间执行调整或修复,而没有潜在数据丢失的风险或经历流应用的重新配置,以及测试和重启流应用。AASC可以利用动态代理约定,例如Java动态代理。 [0055] AASC的程序代码指令注入可以通过记录日志或其它遥测技术来有益于调试应用。 程序代码指令注入可以允许和/或拒绝某些元件或连接以实现安全。程序代码指令注入可以通过在下游网络和/或计算节点停机或以其他方式离线的情况下促进将数据重新路由到可用服务来促进更高的正常运行时间和流可用性。程序代码指令注入可以通过执行一个或多个数据完整性例程以验证某些元组来增加数据准确性。程序代码指令注入可以允许生产环境通过利用第一程序代码指令集合在流应用的一部分上插入演示数据(例如,包含演示数据的元组)来对功能进行演示。例如,流应用的第一部分可以正好位于处理元件和/或流操作器的子集之前。 [0056] AASC可以利用正好在子集之前的第一通用程序执行结构来执行被配置为插入到流应用降级元组中的程序代码指令集。处理单元和/或流操作器的子集可以对降级元组进行操作,并且基于降级元组生成、修改或以其他方式产生元组。第二程序代码指令集合可以由位于流应用的子集之后的第二通用程序执行结构来执行。第二程序代码指令集可以被配置为提取基于降级元组产生的元组。此外,第二程序代码指令集可以被配置为标识作为降级元组的结果而被流应用的子集修改的任何现有元组,并且撤销该修改。 [0057] 图3是根据本公开的一些实施例的被配置为AASC的示例流应用300。流应用300可以以操作器图形302的形式表示。操作器图形302可以向用户可视地表示通过流应用300的数据流。操作器图形302可以具有与图2的操作器图形202类似的配置,除了为了保持清楚而未描绘表示贯穿流应用300的元组流的线之外。操作子图302可以定义如何通过流应用300的各种组件(例如,执行路径、处理的预编译逻辑布局和资源分配)路由元组。流应用300可以包括一个或多个计算节点310‑1、310‑2、310‑3和310‑4(被统称为310);开发系统320;管理系统330;一个或多个处理元件340‑1、340‑2、340‑3、340‑4、340‑5和340‑6(被统称为 340);一个或多个流操作器342‑1、342‑2、342‑3、342‑4、342‑5、342‑6、342‑7(被统称为 342);以及网络350。流应用300还可以包括多个通用程序执行结构。具体地,第一多个通用程序执行结构362‑1、362‑2(被统称为362);第二多个通用程序执行结构364‑1、364‑2(被统称为364);第三多个通用程序执行结构366‑1、366‑2、366‑3和366‑4(被统称为366);以及第四多个通用程序执行结构368‑1和368‑2流应用程序300还可以包括方面数据存储库370。 [0058] 流应用300可以从一个或多个源344接收信息。流应用300可以向一个或多个宿346输出信息。输入可以来自流应用300的外部,诸如来自多个IoT设备。流网络350可以是处理流应用300的各部分之间的连接、发送和接收数据的通信层。例如,流网络350可以是流应用 300内部的数据分组的传输层,并且被配置为通信地耦接处理元件340。 [0059] 每个通用程序执行结构362、364、366或368可以被配置为接收、处理和执行请求。 例如,通用程序执行结构364‑2可以被配置为监听执行程序代码指令集合的请求处理器或钩子。在另一示例中,通用程序执行结构362‑1可以响应于接收到一程序代码指令集合而开始执行所接收的该程序代码指令集合。每个通用程序执行结构362、364、366或368可以通过使用流网络350来操作。例如,程序执行结构366‑3可以通过网络套接字操作以接受来自管理系统330的连接。 [0060] 通用程序执行结构362、364、366或368可以由管理系统330配置。具体地,管理系统 330可以默认地通过不调用、不操作或以其他方式不向流应用300外部的任何特定代码(例如,处理元件340、流操作器342)提供处理周期来操作。管理系统330可以在抢先方面感知模式下操作。例如,在流应用300的操作期间,管理系统可以甚至在接收到执行一程序代码指令集合的请求之前开始将代码编程到通用程序执行结构362、364、366、368中的一个或多个。管理系统330可以在反应方面感知模式下操作。例如,在流应用300的操作期间,管理系统330可以不封装流应用300的任何部分,直到接收到执行一程序代码指令集合的请求。流应用300可以在默认的方面感知模式中操作。例如,在数据处理的开始,除了将计算节点310分配给处理元件340和流操作器342之外,管理系统330还可以将通用程序代码结构362、 364、366、368分配给流应用300的部分。 [0061] 通用程序执行结构362、364、366和368可各自封装流应用300的一部分。具体地,通用程序执行结构362‑1可以被配置为逻辑上刚好在处理元件340‑1、340‑2和340‑3之前发生,此外,通用程序执行结构362‑2可以被配置为逻辑上刚好在处理元件340‑1、340‑2和 340‑3之后发生,因此,被分派到通用程序执行结构362‑1的任何程序代码指令集可以分别刚好在处理元件340‑1、340‑2和340‑3之前执行。作为封装的结果,分派给通用程序执行结构362的程序代码指令集可以在元组流被处理元件340‑1、340‑2和340‑3处理之前或之后对元组流进行操作,因此,流操作器342‑1和342‑2也可以被通用程序执行结构362影响。 [0062] 被封装的流应用的给定部分可以是多个处理元件。例如,多个处理元件340‑1、 340‑2和340‑3可以全部分别仅由两个通用程序执行结构362‑1和362‑2封装。被封装的流应用的给定部分可以是单个处理元件。例如,通用程序执行结构364‑1和364‑2可以封装单个处理元件340‑4。被封装的流应用的给定部分可以是多个流操作器。例如,通用程序执行结构366‑1和366‑2可以封装流操作器342‑4和342‑6。被封装的流应用的给定部分可以是单个流操作器。例如,通用程序执行结构366‑3和366‑4可以封装流操作器342‑5。 [0063] 计算资源可以由流应用300分配给通用程序执行结构362、364、366和368。所分配的计算资源可以是执行流应用300的计算资源的一部分。例如,计算节点310中的一个或多个可以被分配来处理通用程序执行结构362、364、366和368。处理周期和存储器的分配和/或分配可以基于操作器图形302并且基于流应用300的部分的布局。例如,可以基于封装也被分配给计算节点310‑1的流应用的部分(例如,流操作器342‑1、处理单元340‑2)的结构 362‑1和362‑2,将通用程序执行结构362‑1和362‑2分配给计算节点310‑1。在另一实例中,基于也被指派给第一执行线程的流运算器342‑5的配置,可将通用程序执行结构366‑3及 366‑4指派给计算节点310‑2上的第一执行线程。作为封装的一部分的类似线程或其他多处理结构的分配可以导致性能效率(例如,减少线程锁竞争、消除进程死锁、减少进程间通信)。通用程序执行结构362、364、366和368可以被分配给流应用300外部的另一计算机(未示出)的计算资源。向另一计算机的指派可以通过使附加计算资源处理元组流来提高流应用300的性能。每个通用程序执行结构362、364、366和368可以被配置为接收并执行在流应用300的预配置操作之外的程序代码指令。例如,给定的流操作器342‑1或处理单元340‑2可以被配置和编译以对第一元组子集进行操作。相应的通用程序执行结构366‑3和/或366‑4可以被配置为对第一元组子集之外的元组进行操作。 [0064] 管理系统330可以被配置为响应于执行程序代码指令的请求(例如,请求380)。请求380可以是提供给AASC流应用300的请求的示例。请求380可以从用户接收。 [0065] 请求380可以包括一程序代码指令集合。该程序代码指令集合可以是包或其他相关软件构造的形式,例如方面包的形式。该程序代码指令集合可以包含编译软件库。编译软件库可以以与流应用的特定部分兼容的可执行格式来配置。举例来说,流操作器342‑7可以第一软件语言配置,且如果一程序代码指令集合指向通用程序执行结构368‑1或368‑2,那么程序代码指令集合可需要为第一软件语言以便可执行。该程序代码指令集合可以仅被写入一组特定的认可接口中。举例来说,将接受数据元组且使用由经批准接口定义的元组模式返回数据元组的单功能实施方案。 [0066] 请求380还可以包括程序执行指令集合。该程序执行指令集合可以包含流应用目标。流应用目标可以是给定流应用的特定处理元件或流操作器。例如,请求380可以包括流应用目标,其包括具体标识流操作器342‑5的流操作器标识符,请求380因此可以指示所包括的程序代码指令集要由通用程序执行结构366‑3和366‑4(例如,封装流操作器342‑5的通用程序执行结构)执行。 [0067] 管理系统330可以指示通用程序执行结构362、364、366或368中的至少一个给定的通用程序执行结构来执行所接收的程序代码指令集(例如,作为请求380的一部分的程序代码指令)。流应用300的部分的集合的特定部分可以基于请求380。具体地,特定部分可以指定网络350可以接收的指令的一部分(例如,现有作业ID、基于位置或端口的给定流操作器 342)以及要执行的程序代码指令集。管理系统330可以基于请求来标识特定流应用目标。例如,请求380可以包括一种类型的特定流操作,例如适用于包括的程序代码指令集的所有“设置”操作。作为响应,管理系统330可以扫描操作器图形302以标识执行“SET”操作的一个或多个流操作器342或处理元件340的子集。管理系统330可以指示给定的通用程序执行结构362、364、366或368以一个或多个条件(例如,执行程序代码指令的次数、执行程序代码指令达一定量的时间、在流应用300的部分处发生一个或多个条件或输入或输出之前或之后执行程序代码指令)来执行所接收的程序代码指令集。条件可以作为程序执行指令的一部分(例如,请求380的一部分)而被接收。 [0068] 管理系统330还可以存储程序代码指令以供稍后使用。具体地,一旦管理系统330接收到请求380,管理系统330就可以将该程序代码指令集合存储到方面数据存储库370中。 方面数据存储库370可以是被配置为存储方面束和其他程序代码指令的数据库、存储器、三级存储或其他数据结构。方面数据存储库370中的存储可以实现用于流应用300的AASC的高可用性。将来的请求可能仅需要标识特定的程序代码指令集(例如,通过文件名或其它唯一标识符)。响应于接收到具有标识符而没有特定程序代码指令集的请求,管理系统330可以被配置为扫描方面数据存储库370以检索所存储的程序代码指令集。来自不同用户的其它请求可通过标识符来标识特定程序代码指令集以在不同时间运行。 [0069] 管理系统330可以在安全模式下操作。具体地,管理系统330可以被配置为处理所提交的请求的认证和授权。所提交的任何请求在被允许传递到特定的通用程序执行结构 362、364、366或368之前可以由管理系统330授权。管理系统330和任何请求者可以通过安全通信信道(例如,通过加密网络,使用公共/私有证书)通信。请求者可能无法直接执行程序代码指令集合,而仅能通过管理系统330提交和认证。 [0070] 流应用300的AASC可以促进可以在流计算操作期间调用的一组可扩展增强。详细地,各种程序代码指令集合可由通用程序执行结构362、364、366和/或368中的一个或多个执行,以对流应用执行导致特定用例的各种操作。例如,第一用例可以是元组生成和注入,其充当动态源以将元组注入到用于重放流的流操作器中、调试操作器逻辑以及按需元组处理。在另一示例中,第二用例可以是元组确认,其检查元组是否根据模式有效或者在有效范围内;此外,该程序代码指令集合还可以被配置为丢弃可以被确定为无效的元组。在又一示例中,第三用例可以是元组变换,其包括可以被添加以操纵某些元组的动态定制逻辑。 [0071] 由流应用300的AASC促进的其他增强可以包括用于执行以下操作的程序代码集合:日志记录、调试、剖析、通知、缓存、重新路由、丢弃和事务处理。在第一示例中,日志记录可以通过调试或审计日志记录来发生,该日志记录可以被配置为包括给定用户、数据、时间以及操作是否成功。在第二示例中,通过比较处理发生之前和之后的时间戳确定流操作器 342处理元组花费多长时间,可以发生剖析。在第三示例中,当满足在程序代码指令集合中定义的某些准则时,可以发送通知。在第四示例中,高速缓存可以基于被配置为保存某些元组以用于离线处理的程序代码指令而发生。在第五示例中,重新路由可以基于定义将某些元组路由到另一个流操作器的规则的程序代码指令而发生,例如当第一流操作器过载或经历某些性能问题时。在第六示例中,丢弃可以基于定义丢弃元组的规则的程序代码指令而发生,诸如减轻过载的流操作器,或者基于更新的过滤条件而发生。在第七实例中,事务处理可基于程序代码指令而发生,以使单个元组的数据分裂成多个元组。第七示例中的逻辑可以包括程序代码指令,其门控元组处理继续进行,以仅在事务中的所有元组被给定流操作器342接收的情况下发生。在第八示例中,安全性可以基于被配置为阻止来自被认为是恶意的某些连接或用户的数据的程序代码指令而发生。 [0072] 图4描绘了根据本公开的一些实施例的执行方面感知的流计算的方法400。方法 400通常可以在固定功能硬件、可配置逻辑、逻辑指令等或其任意组合中实现。例如,逻辑指令可以包括汇编指令、ISA指令、机器相关指令、微码、状态设置数据、集成电路的配置数据、使电子电路和/或硬件本地的其它结构部件(例如,主处理器、中央处理单元/CPU、微控制器等)个性化的状态信息。方法400可以由诸如计算机系统100的单个计算机执行。方法400可由流应用程序(例如流应用程序400)执行。 [0073] 从开始405,方法400可以通过监测流应用的活动开始。可以通过确定流应用的一个或多个处理元件和/或流操作器是否可操作并且配置为主动处理元组流来执行对流应用的监测。 [0074] 如果在420流应用是活动的:Y,方法400可以在430通过监听程序请求而继续。监听程序请求可由流应用的一部分发生。例如,流应用的管理系统可以通过监听请求来操作。 [0075] 如果接收到程序请求,则在440:Y,方法400可以通过在450处标识流应用的流应用目标来继续。具体地,请求可以包括作为请求的目标(例如,基于标识符)的特定流操作器或处理元件。请求可以包括流应用的特定类型、类别或部分的组。例如,指定“任何SET流操作器”的流应用目标可以被包括在请求中。请求可以不包括流应用目标,但是可以间接标识流应用目标。例如,请求可以包括要执行的一程序代码指令集合的特定标识符。该请求可以仅包括程序代码指令的标识符,而不包括目标。在接收到请求时,可以扫描、搜索或以其他方式访问程序储存库(例如,方面数据存储库370)。可以通过从程序储存库取回程序代码指令并且扫描程序代码指令以确定要由程序代码指令处理的流应用的部分来执行对流应用目标的标识。 [0076] 在460,可以封装流应用的一部分。流应用程序可封装有被配置为接收并执行程序代码指令的通用程序执行结构。流应用可以在流应用的运行时期间被封装。例如,给定的流操作器或处理元件可以配置有第一输入和第一输出。第一输入可以被配置为接收元组流的多个元组,并且第一输出可以被配置为输出元组流的第二多个元组。给定的流操作器或处理单元还可以配置有第二输入;第二输入可以被配置为接收方面标志,诸如布尔值或数字值。默认地,在流应用的执行开始时,流操作器或处理元件的默认配置可以在没有任何通用程序执行结构是可达的或可操作的情况下操作。在没有接收到任何方面标志的情况下,流应用可以不与任何通用程序执行结构一起操作。在接收到标志时,流应用可以开始利用封装的通用程序执行结构来操作。 [0077] 在470处,流应用的一部分可以执行所标识的程序代码指令。流应用的该部分可以是在流应用的该部分之外的一个或多个处理周期的集合,诸如管理系统或不是流应用的预编译逻辑的一部分的其他部分可以将程序代码指令传输到通用程序执行结构。通用程序代码执行结构可以执行程序代码指令。在执行程序代码指令之后,方法400可通过在410处监测流应用而继续。如果在410流应用不是活动的:N,方法400可以在495结束。 [0078] 本发明可以是任何可能的技术细节集成水平的系统、方法和/或计算机程序产品。 计算机程序产品可以包括其上具有计算机可读程序指令的计算机可读存储介质(或多个介质),计算机可读程序指令用于使处理器执行本发明的各方面。 [0079] 计算机可读存储介质可以是能够保留和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质可以是例如但不限于电子存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或前述的任何合适的组合。计算机可读存储介质的更具体示例的非穷举列表包括以下:便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式光盘只读存储器(CD‑ROM)、数字多功能盘(DVD)、记忆棒、软盘、诸如上面记录有指令的打孔卡或凹槽中的凸起结构的机械编码装置,以及上述的任何适当组合。如本文所使用的计算机可读存储介质不应被解释为暂时性信号本身,诸如无线电波或其他自由传播的电磁波、通过波导或其他传输介质传播的电磁波(例如,通过光纤线缆的光脉冲)、或通过导线传输的电信号。 [0080] 本文中所描述的计算机可读程序指令可以从计算机可读存储介质下载到相应的计算/处理设备,或者经由网络,例如因特网、局域网、广域网和/或无线网络,下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光传输光纤、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或网络接口从网络接收计算机可读程序指令,并转发计算机可读程序指令以存储在相应计算/处理设备内的计算机可读存储介质中。 [0081] 用于执行本发明的操作的计算机可读程序指令可以是汇编指令、指令集合架构(ISA)指令、机器相关指令、微代码、固件指令、状态设置数据、集成电路的配置数据,或者以一种或多种编程语言(包括面向对象的编程语言,例如Smalltalk、C++等)和过程编程语言(例如“C”编程语言或类似的编程语言)的任意组合编写的源代码或目标代码。计算机可读程序指令可以完全在用户的计算机上执行,部分在用户的计算机上执行,作为独立的软件包执行,部分在用户的计算机上并且部分在远程计算机上执行,或者完全在远程计算机或服务器上执行。在后一种情况下,远程计算机可以通过任何类型的网络连接到用户的计算机,包括局域网(LAN)或广域网(WAN),或者可以连接到外部计算机(例如,使用因特网服务提供商通过因特网)。在一些实施例中,为了执行本发明的各方面,包括例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA)的电子电路可以通过利用计算机可读程序指令的状态信息来执行计算机可读程序指令以使电子电路个性化。 [0082] 在本文中参考根据本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本发明的各方面。将理解的是,流程图和/或框图的每个框以及流程图和/或框图中的框的组合可以由计算机可读程序指令来实现。 [0083] 这些计算机可读程序指令可以被提供给计算机或其他可编程数据处理装置的处理器以产生机器,使得经由计算机或其他可编程数据处理装置的处理器执行的指令创建用于实现流程图和/或框图的一个或多个框中指定的功能/动作的装置。这些计算机可读程序指令还可以存储在计算机可读存储介质中,其可以引导计算机、可编程数据处理装置和/或其他设备以特定方式工作,使得其中存储有指令的计算机可读存储介质包括制品,该制品包括实现流程图和/或框图的一个或多个框中指定的功能/动作的各方面的指令。 [0084] 计算机可读程序指令还可以被加载到计算机、其他可编程数据处理装置或其他设备上,以使得在计算机、其他可编程装置或其他设备上执行一系列操作步骤,以产生计算机实现的过程,使得在计算机、其他可编程装置或其他设备上执行的指令实现流程图和/或框图的一个或多个框中指定的功能/动作。 [0085] 附图中的流程图和框图示出了根据本发明的各种实施例的系统、方法和计算机程序产品的可能实现的架构、功能和操作。在这点上,流程图或框图中的每个框可以表示指令的模块、段或部分,其包括用于实现指定的逻辑功能的一个或多个可执行指令。在一些备选实施方式中,框中所注明的功能可不按图中所注明的次序发生。例如,连续示出的两个框实际上可以作为一个步骤来实现,同时、基本同时、以部分或全部时间重叠的方式执行,或者这些框有时可以以相反的顺序执行,这取决于所涉及的功能。还将注意,框图和/或流程图图示的每个框以及框图和/或流程图图示中的框的组合可以由执行指定功能或动作或执行专用硬件和计算机指令的组合的专用的基于硬件的系统来实现。 [0086] 已经出于说明的目的呈现了对本公开的各种实施例的描述,但是其并非旨在是穷举的或限于所公开的实施例。在不背离所描述的实施例的范围和精神的情况下,许多修改和变化对于本领域的普通技术人员将是显而易见的。选择本文中所使用的术语来解释实施例的原理、实际应用或对市场上存在的技术改进,或使本领域的其他普通技术人员能够理解本文所公开的实施例。