一种基于流式的编程系统和方法
技术领域
本发明涉及一种编程系统和方法,尤其涉及一种基于流式的编程系统和方法。
背景技术
FBP(Flow Based Programming,基于流式的编程)是一个编程范式,在这种范式下,应用程序被看成为一个“黑盒”的流程,通过预定义的链接关系进行交换数据,形成一个完整的网络流程。这一构建过程在经过UI(User Interface,用户界面)可视化后,大大减少了人的代码阅读成本和流程构建开销。
传统的FBP编程主要用于复杂任务的处理。基于FBP的应用目前主要集中在软件领域,用于构建复杂任务,或者数据处理流,在电子和通信领域的模拟仿真软件、电路设计、可编程逻辑器件烧写驱动软件上也有广泛应用,在互联网领域则没有太大的应用。同时,这些软件大多目的在于纯静态任务的构建,仅仅相当于节约了代码书写的过程,而没有对更多变的应用场景进行适应。
在当前的互联网发展阶段,大数据计算、机器学习等新场景,目标都在于进行执行复杂或者重量级任务,比如基于或者非常接近于有向无环图(DAG)模型的大数据任务处理框架Spark还有机器学习框架TensorFlow,通过具有严格拓扑关系的有向无环图描述方法把小操作集合构建成严密的数据处理流。上述两项应用场景的特点是执行时间漫长,需要经常调整参数进行控制,同时构建时产生的bug不易直接发现。比如工程师在数据流的某一过程中写了错误的代码,很难被立即发现,只能在执行过程中发现,且停止任务重新执行的时间开销太大。
发明内容
本发明的目的之一是提供一种基于流式的编程系统,该系统能适应多变的应用场景,并且可用于互联网领域。此外在某些进一步的方案中还能在编程过程中保证描述任务的结构模型的正确性。
基于上述发明目的,本发明提出了一种基于流式的编程系统,其包括结构模型和执行引擎;其中:
所述结构模型具有若干个处理单元,所述各处理单元在结构模型内按照可更改的数据流动路径连接,以生成各种有向无环图模型;
所述执行引擎对有向无环图模型进行执行。
在本技术方案中,处理单元即对应每个子处理过程,例如对输入数据进行计算,请求某个服务得到信息等,其没有明确的限制。处理单元通常可以自由地进行编写和定义,每个处理单元的定义通常由若干个输入、若干个输出和若干个参数决定。输入可以接在这个处理单元的前序处理单元的输出上。所述前序处理单元即所有连接着这个处理单元并且拓扑顺序上处于这个处理单元前的处理单元,反之则为后序处理单元。参数是处理单元自身的属性,而输出则可以给这个处理单元的后序处理单元提供输入。这三个特性共同决定着一个处理单元在一个具体任务中所要做的事情。通过对若干个处理单元的连接就形成了一个有向无环图。
例如,存在一个目标函数f(x)=a·x+b,其具有两个子函数:
f(x)=a·x (1)
f(x)=x+b (2)
那么传入x到子函数(1),把子函数(1)的输出传入到子函数(2),就完成了这一操作,这就是一个简单的有向无环图模型实例。通过拓扑排序的手段可以对这个有向无环图模型进行排序,执行引擎按照得到的拓扑顺序进行执行,保证了可执行性,即使当任务流程非常复杂时,也能通过编辑模型的方式很快地完成构建。
比如仍然是这两个子函数,调整了先后顺序,传入x到子函数(2),把子函数(2)的输出传入到子函数(1),就产生了f(x)=a·(x+b)这个目标函数。
需要格外注意的是,这个模型在定义的时候,是没有明确的数据的,可以认为是在铺设沟渠,只有在实际执行的时候才有数据进来,可以认为是水从沟渠的开始灌注并流过所有沟渠最终流出。
结构模型是处理单元的容器,目的是产出有向无环图模型。在结构模型中,每个处理单元表现为一个节点的形式。通过编辑处理单元,定义每个处理单元的输入和输出关系,编辑每个处理单元的参数,可以产生实时的有向无环图模型,由此控制整个由处理单元组成的目标任务。
执行引擎对结构模型的产出,也就是有向无环图模型进行执行。在得到最新的任务描述后,按照最新有向无环图的拓扑顺序,并且经过层次关系合并后,并行地对在拓扑结构上处于同一层的处理单元进行执行,在得到处理单元的输出后,为下一层的处理单元分发得到的前一层输出结果并进行并行执行,逐层递归直到最后一层,由此正确地对有向无环图模型进行执行并完成任务处理。这种执行算法可以在拓扑关系上保证任务执行时数据获取和产出的正确性。
执行引擎仅仅进行输入输出的传输和流程控制,并不实际影响输入和输出的具体内容和要求,具体执行内容均在处理单元的实际代码中定义。
本发明所述的基于流式的编程系统,其通过结构模型和执行引擎,基于现有或者自由编写的处理单元,通过编辑结构模型的方式,构建执行引擎能够执行的目标任务流程。
本发明所述的基于流式的编程系统中,所述各处理单元之间的数据流动路径可以根据需求更改,因此能适应多变的应用场景。
本发明所述的基于流式的编程系统可以基于FBP(Flow-Based Programming)实现。
进一步地,本发明所述的编程系统还包括处理单元库,所述处理单元库向结构模型提供各处理单元,所述处理单元库向执行引擎提供处理单元的执行代码。
进一步地,本发明所述的编程系统中,当结构模型的结构发生变化时,该变化被同步给执行引擎,执行引擎在后续执行过程中,按照经过变化的结构执行被改变的有向无环图模型。
更进一步地,上述编程系统中,所述结构模型的结构发生变化包括:所述数据流动路径发生变化和/或处理单元的自身参数发生变化。
进一步地,本发明所述的编程系统中,当执行引擎在执行过程中发生执行变化时,该执行变化被同步给结构模型。
在本技术方案中,结构模型产生的任何结构变化,通常都要同步给执行引擎产生同步。同样,执行引擎可能会在具体执行的过程中自发地产生一些变化,这些变化也要同步到结构模型中。
其中所谓结构变化包括:数据流动路径发生变化和/或处理单元的自身参数发生变化,数据流动路径发生变化可以由处理单元输入连接、输出连接的变化引起。需要说明的是,在本技术方案中,结构模型的结构变化是由用户选择或决定的。例如,一个处理单元A,这个处理单元的某个输入连接在B处理单元的某个输出上,在切换到C上时,这个过程就产生了结构变化。又比如一个处理单元A,这个处理单元的输入1连接在B处理单元的输出1上,当切换到B处理单元的输出2上时,也发生了结构变化。这种结构变化具有后序传导的特性。其中后序是指拓扑顺序在某处理单元节点后并且能够按照拓扑关系回溯到该处理单元节点的所有处理单元节点。如果依然使用沟渠的例子,所谓后序即从某支流流出的水能够流到的其他支流为该支流的后序。
另外,在很多情况下,一个处理单元本身的定义往往是动态的,比如,一个处理单元,其输入可能具有动态的定义,即可以接受若干个输入内容或者可以不接受一些输入内容;又或者其具体输出可能会根据其自身参数或者输入连接的数目进行确定,又或者在处理不同的数据时,产生的内容在结构上是不一样的,仅有部分变化等。总的来说,就是一个处理单元在面对不同情况时其自身拓扑结构可能是不同的,可能会有动态的改变。这时就需要对处理单元实现动态定义。
动态定义允许每个处理单元在定义输入、输出的拓扑结构时允许动态,或者定义某个输入为并不完全需求。比如一个处理单元,对每一个输入数据进行数值计算,产出同样数量的输出,则这个处理单元的输入和输出的定义都是动态的。若这个处理单元还有一个输入,这个输入决定了一个数值计算参数,但由于默认值的存在,这个输入并不是一定需求的,因此这个输入不仅仅是动态的,还可以是不需要的。
动态定义能力特性使本发明能够适应更为复杂的场景。在本技术方案中,当执行引擎在执行过程中发生执行变化时其对应的就是上文所描述的动态定义指的是由执行引擎发起的变化。此外,从上文的描述可以看出,在本技术方案中,虽然说动态定义确实是处理单元本身的性质,但是这一性质的展现来源于执行引擎在执行时产生的变化,这一变化需要在处理单元的具体执行代码中体现,而执行引擎会捕捉到这个变化并同步给结构模型,因此,动态定义被认为是由执行引擎发起的变化。该动态定义变化或者说执行引擎在执行过程中发生的执行变化也需要同步给结构模型。需要说明的是,在本技术方案中,动态定义变化或者说执行引擎在执行过程中发生的执行变化并不是用户自行选择或决定的。
综上,同步过程即当结构模型发生变化时,同步新的结构信息给执行引擎,执行引擎应用新的结构信息,并且把这一变化后序传播出去,更新后序处理单元,同时在更新过程中,按照不同的处理单元面对的不同的最新情况调整其自身的定义,比如由于切断了某两个处理单元的连接关系,这个连接关系中处于后序的处理单元可能会发生动态定义调整。同时,当处理单元发生动态定义调整时,执行引擎再把其执行变化同步给结构模型,结构模型更新自身并且实时反应在结构模型上,以供用户实时得知。
同步过程确保了系统的双向最新特性,并且实现了动态定义的特性,也完成了系统的实时校验。
上述方案使得能够在编辑结构模型时实时得知执行状态和流程正确性,从而在编程过程中保证描述任务的结构模型的正确性,并且自由地对相应任务的处理细节进行修改和更快地绘制新任务流程相应的结构模型,从而不仅提高了任务定义的效率,避免了任务流程的bug,也没有对具体处理单元做出很多的限制或者约定,适用场景非常广泛。
本发明的另一目的是提供一种基于流式的编程方法,该方法能适应多变的应用场景,并且可用于互联网领域。此外在某些进一步的方案中还能在编程过程中保证描述任务的结构模型的正确性。
基于上述发明目的,本发明还提供了一种基于流式的编程方法,其包括步骤:
按照可更改的数据流动路径连接若干个处理单元以搭建成各种结构模型,所述各种结构模型对应生成各种有向无环图模型;
执行引擎对有向无环图模型进行执行。
本发明所述的基于流式的编程方法,其根据需求基于现有或者自由编写的处理单元,连接各处理单元或更改各处理单元之间的数据流动路径,从而搭建或编辑相应的结构模型,构建执行引擎能够执行的目标任务流程。
本发明所述的基于流式的编程方法中,所述各处理单元之间的数据流动路径可以根据需求更改,因此能适应多变的应用场景,并且可基于UI技术用于互联网领域。
本发明所述的基于流式的编程方法可以基于FBP实现。
相关概念和原理在相应的系统部分已有描述,在此不再赘述。
进一步地,本发明所述的编程方法中,所述处理单元选自处理单元库,所述处理单元库还向执行引擎提供处理单元的执行代码。
进一步地,本发明所述的编程方法中,当结构模型的结构发生变化时,该变化被同步给执行引擎,执行引擎在后续执行过程中,按照经过变化的结构执行被改变的有向无环图模型。
更进一步地,上述编程方法中,所述结构模型的结构发生变化包括:所述数据流动路径发生变化和/或处理单元的自身参数发生变化。
进一步地,本发明所述的编程方法中,当执行引擎在执行过程中发生执行变化时,该执行变化被同步给结构模型。
上述方案能在编程过程中保证描述任务的结构模型的正确性。相关原理在相应的系统部分已有描述,在此不再赘述。
进一步地,本发明所述的编程方法中,所述结构模型被建立在可视化编辑面板上。
上述方案可基于UI技术实现。在本技术方案中,结构模型被建立在可视化编辑面板上是为了实现可视化编辑,而可视化编辑可以提高编辑效率,避免编写代码过程和这个过程中可能发生的错误。
本发明所述的基于流式的编程系统,其具有以下优点和有益效果:
(1)解决了编程过程中目标任务的结构特性的正确性不可在编程中得知的问题,结构模型会有实质展现并且产生正确性的校验,可以在构建过程中进行正确性的校验。
(2)使用已经进行过标准化封装的具体任务节点,可以通过自动的任务流检测进行验证,保证任务结构的正确性,同时大大加速了模型构建过程,甚至不需要代码编写即可完成复杂任务描述。
(3)复用性和可修改可拓展能力极强,对于构建好的结构,只需要做很小的调整即可。
(4)由于动态定义和同步过程的存在,具有极好的动态特性,能适应更复杂的场景。
本发明所述的基于流式的编程方法,其同样具有上述效果。
附图说明
图1为本发明所述的基于流式的编程系统在一种实施方式下的结构示意图。
图2为本发明所述的基于流式的编程系统在一种实施方式下的结构模型的部分结构示意图。
图3为本发明所述的基于流式的编程系统在一种实施方式下的工作流程示意图。
图4为本发明所述的基于流式的编程方法在一种实施方式下的流程示意图。
具体实施方式
下面将结合说明书附图和具体的实施例来对本发明所述的基于流式的编程系统和方法进行进一步地详细说明,但是该详细说明不构成对本发明的限制。
图1显示了本发明所述的基于流式的编程系统在一种实施方式下的结构,图2显示了该实施方式下的结构模型的部分结构。
如图1所示,结合参考图2,该基于流式的编程系统包括:位于客户端网页并与用户5交互的结构模型1,该结构模型1被建立在可视化编辑面板上,此外还包括执行引擎2、处理单元库3,其中:
如图2所示,结构模型1具有若干个处理单元11,各处理单元11在结构模型1内按照可更改的数据流动路径连接,以生成各种有向无环图模型4。
图2显示了一个编辑构建完成的http服务器系统的结构模型的一部分,不同处理单元11之间存在有序的连接关系,从前序(左边连接为前序)处理单元中获取这个处理单元需要的输出,并且提供不同的输出给不同的后序(右边连接为后序)处理单元,完成一整个工作流。在这个实施方式中,A类节点代表形成http响应路径服务的处理单元,获取前序路径并且提供新的路径节点供后续处理单元挂载,B类节点是接口处理单元,即对所挂在的路径进行具体的响应的处理单元,挂载在路径上形成http接口,对http请求进行处理,而其处理方式则从C类处理单元上获取,C类处理单元包括数据库连接处理单元,数据库表模型构建处理单元,类型转换处理单元,查询引擎单元等不同的处理单元,同时这些处理单元之间也有数据流通关系,表模型构建处理单元从数据库连接处理单元中获取数据库的信息,而查询引擎处理单元则从表模型构建处理单元中获取后者处理好的数据库表模型,用于自己处理http请求内容,进行数据表的查询。
执行引擎2对有向无环图模型4进行执行。
处理单元库3向结构模型1提供各处理单元11,处理单元库3向执行引擎2提供处理单元11的执行代码。
当结构模型1的结构发生变化时,该变化被同步给执行引擎2,执行引擎2在后续执行过程中,按照经过变化的结构执行被改变的有向无环图模型4。其中,结构模型1的结构发生变化包括:数据流动路径发生变化和处理单元11的自身参数发生变化。
当执行引擎2在执行过程中发生执行变化时,该执行变化被同步给结构模型1。
图3为本发明所述的基于流式的编程系统在一种实施方式下的工作流程示意图。
如图3所示,该实施方式的基于流式的编程系统的工作流程包括:
步骤110:用户5在客户端网页中的结构模型的可视化编辑面板上,拖拽一个个作为选自处理单元库的处理单元(即节点)到结构模型的可视化编辑面板中。
步骤120:用户5按照可更改的数据流动路径连接若干个处理单元11以搭建成各种结构模型1,各种结构模型1对应生成各种有向无环图模型4。
步骤130:结构模型1和执行引擎2之间双向同步:
当结构模型1的结构发生变化时,该变化被同步给执行引擎2,执行引擎2在后续执行过程中,按照经过变化的结构执行被改变的有向无环图模型4。其中,结构模型1的结构发生变化包括:数据流动路径发生变化和处理单元11的自身参数发生变化。
当执行引擎2在执行过程中发生执行变化时,该执行变化被同步给结构模型1。
上述步骤110至步骤130完成一个任务流程或者服务器的构建。由于结构模型的传播特性和双向同步过程,在构建过程中所有的动态定义和处理单元修改逻辑都会得到实时保证,可以得到正确的任务模型,避免了bug的产生。
步骤140:执行引擎2对有向无环图模型4进行执行。其中,处理单元库3向执行引擎2提供处理单元3的执行代码。
上述实施方式基于已有的统一化封装的处理单元库。对于没有现成的处理单元库的情况,需要对处理单元进行编写。首先,定义处理单元的拓扑性质:具有哪些输入输出和属性,其中每个输入输出的动态特性,必需关系是什么。然后,对执行代码进行编写,同时在这一过程中需要体现其动态能力,在具体的输入和属性定义情况下会发生怎么样的输出改变等逻辑。由此即可实现统一化的处理单元封装,供给后续使用,并且可以将自己做好的处理单元库贡献到开源社区中供共享使用。
由于涉及到处理单元编写和结构模型1可视化编辑过程,因此也称之为混合式编程。对用户而言,在已拥有处理单元定义的情况下只需要编辑出结构模型1即可完成目标,大大降低了工作量。
图4为本发明所述的基于流式的编程方法在一种实施方式下的流程示意图。
如图4所示,该基于流式的编程方法包括步骤:
(1)按照可更改的数据流动路径连接若干个处理单元以搭建成各种结构模型,各种结构模型对应生成各种有向无环图模型。
(2)执行引擎对有向无环图模型进行执行。
在某些实施方式下,处理单元选自处理单元库,处理单元库还向执行引擎提供处理单元的执行代码。
在某些实施方式下,当结构模型的结构发生变化时,该变化被同步给执行引擎,执行引擎在后续执行过程中,按照经过变化的结构执行被改变的有向无环图模型。
在某些实施方式下,结构模型的结构发生变化包括:数据流动路径发生变化和/或处理单元的自身参数发生变化。
在某些实施方式下,当执行引擎在执行过程中发生执行变化时,该执行变化被同步给结构模型。
在某些实施方式下,结构模型被建立在可视化编辑面板上。
需要注意的是,以上列举的仅为本发明的具体实施例,显然本发明不限于以上实施例,随之有着许多的类似变化。本领域的技术人员如果从本发明公开的内容直接导出或联想到的所有变形,均应属于本发明的保护范围。