CN112527471A - 任务处理方法及其装置、存储介质 - Google Patents
任务处理方法及其装置、存储介质 Download PDFInfo
- Publication number
- CN112527471A CN112527471A CN201910887217.1A CN201910887217A CN112527471A CN 112527471 A CN112527471 A CN 112527471A CN 201910887217 A CN201910887217 A CN 201910887217A CN 112527471 A CN112527471 A CN 112527471A
- Authority
- CN
- China
- Prior art keywords
- task
- client
- primary
- subtask
- ith
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/461—Saving or restoring of program or task context
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/466—Transaction processing
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer And Data Communications (AREA)
Abstract
本申请实施例公开了一种任务处理方法及其装置、存储介质,任务处理方法应用于集群中的客户端,集群中包括多个能够互相通信的客户端,方法包括:接收任务发送端发送的第一任务;确定第一任务为可拆分的复合任务时,拆分第一任务,得到k个初级子任务;其中,k为正整数,k≥1;向对应的客户端发送k个初级子任务;其中,初级子任务对应的客户端由初级子任务的类型确定;接收对应的客户端发送的初级子任务的执行结果;根据各初级子任务的执行结果,确定第一任务的第一执行结果;向任务发送端发送第一执行结果。本申请实施例中通过将拆分得到的初级子任务发送给集群中的其他客户端,可以实现任务的分布式执行,降低各个客户端处的运算压力。
Description
技术领域
本申请实施例涉及计算机通信技术领域,涉及但不限于一种任务处理方法及其装置、存储介质。
背景技术
工作流管理技术是一种将计算抽象为任务并通过图的方式表达任务依赖的技术。通过工作流管理技术,用户可以将工作流中的任务并发且分发到不同机器上执行,而无需考虑计算的时间和空间属性,极大地简化了开发难度。
用于通过对工作流进行管理、执行工作流中的任务的装置被称作工作流引擎。相关技术中的工作流引擎可以实现一些有益功能,但这些功能大多是以静态预定义的方式加入,比如:可以实现失败回退功能,从而提高容错性。但复杂的现实场景需要工作流的处理方法具有更高效的性能。
发明内容
有鉴于此,本申请实施例提供一种任务处理方法及其装置、存储介质。
本申请实施例提供一种任务处理方法,所述方法应用于集群中的客户端,所述集群中包括多个能够互相通信的客户端,所述方法包括:
接收任务发送端发送的第一任务;
确定所述第一任务为可拆分的复合任务时,拆分所述第一任务,得到k个初级子任务;其中,k为正整数,k≥1;
向对应的客户端发送所述k个初级子任务;其中,初级子任务对应的客户端由所述初级子任务的类型确定;
接收对应的客户端发送的初级子任务的执行结果;
根据各初级子任务的执行结果,确定所述第一任务的第一执行结果;
向所述任务发送端发送所述第一执行结果。
本申请实施例还提供一种任务处理装置,所述装置为集群中的客户端,所述集群中包括若干个可以互相通信的客户端,所述装置包括:
收发模块,用于接收任务发送端发送的第一任务;
任务拆分模块,用于确定所述第一任务为可拆分的复合任务时,拆分所述第一任务,得到k个初级子任务;其中,k为正整数,k≥1;
所述收发模块,还用于向对应的客户端发送所述k个初级子任务;其中,初级子任务对应的客户端由所述初级子任务的类型确定;
所述收发模块,还用于接收对应的客户端发送的初级子任务的执行结果;
执行结果生成模块,用于根据各初级子任务的执行结果,确定所述第一任务的第一执行结果;
所述收发模块,还用于向所述任务发送端发送所述第一执行结果。
本申请实施例又提供一种任务处理装置,所述装置包括:存储器、处理器,所述存储器存储有可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述任务处理方法。
本申请实施例还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机可执行指令,该计算机可执行指令配置为执行上述任务处理方法。
本申请实施例中,将拆分得到的初级子任务发送给集群中的其他客户端,可以实现任务的分布式执行,降低各个客户端处的运算压力。对应的客户端接收到初级子任务,将初级子任务执行完毕之后,会向本地客户端发送执行结果。为了获知发出任务的执行结果,相对于任务发送端定期查询数据库的方式,本申请实施例中的任务接收端即时反馈方式可以提高任务的执行效率,减少指令的发送次数,从而节省计算资源。
附图说明
图1为本申请实施例的任务处理方法流程示意图;
图2为本申请实施例中初级子任务形成的树状图;
图3为本申请实施例中执行任务处理方法的客户端的组成结构示意图;
图4为本申请实施例中“任一”触发器的触发过程示意图;
图5为本申请实施例中“全部”触发器的触发过程示意图;
图6为本申请实施例中集群内的客户端注册过程的示意图;
图7为本申请实施例中发送和接收任务的客户端的组成结构示意图;
图8为本申请实施例中原子任务的执行流程示意图;
图9为本申请实施例的任务处理装置的组成结构示意图;
图10为本申请实施例中任务处理装置的一种硬件实体示意图。
具体实施方式
相关技术中,任务内的参数化固然可以简化用户配置工作流的过程,但是实际场景中更有意义的是引用前置任务的输出,例如:根据前置的数据抽取任务处理的数据量,动态确定后置任务使用的映射数。
此外,相关技术中的分布式工作流引擎需要将状态存入一个公共数据库,并在执行过程中不断的查询公共数据库来确定任务是否结束,在任务量大时,效率较低。
而且,在进行工作流编排的过程中,会出现大量不同工作流共享一部分相似的子工作流但却有些微不同的场景。比如,多份以相同方式处理数据的工作流只有数据的来源不同。此时,用户需要多次复制这一相同的结构,并修改其中有差异的配置,耗时较长且易于出错。
基于以上问题,本申请实施例提出一种任务处理方法,来实现工作流引擎的功能,用于对工作流进行处理。本申请实施例中,工作流表现为复合任务的形式,以符号表来维护复合任务中的上下文,使得后置任务可以引用前置任务的输出。
此外,前置任务通过向后置任务发送触发信号来驱动后置任务的执行,替代了相关技术中分布式工作流中对数据库状态的轮询,大大降低了工作流引擎对数据库的访问量,在同时运行大量工作流时有效降低了数据库的负载,提高了工作流引擎的吞吐量。
而且,本申请实施例中在不同的客户端中加载不同的原子任务,使得用户需要多次使用相同的数据处理流程时,只需要将需要的参数发送给该数据处理流程对应的原子任务所在的客户端,提高数据处理效率,降低出错率。
下面结合附图和实施例对本申请的技术方案进一步详细阐述。
实施例一
本申请实施例提供一种任务处理方法,如图1所示,该任务处理方法应用于集群中的客户端,所述集群中包括多个能够互相通信的客户端,包括:
S110,接收任务发送端发送的第一任务。
这里,任务发送端可以是任务输入接口,也可以是集群中的其他客户端。如果任务发送端是任务输入接口,第一任务会以流程规格文件的形式呈现;如果任务发送端是其他客户端,第一任务会以符号表和抽象语法树的形式呈现。
流程规格文件是一个文本文件,根据流程规格文件的特定文档结构,将工作流记录在流程规格文件中,可以清晰地展现工作流中各个任务可以实现的功能,以及各个任务之间的依赖关系。通过各个任务的目标指向,还可以展现工作流中包含的流程的执行顺序。
在计算机科学中,抽象语法树(Abstract Syntax Tree,AST)是源代码语法结构的一种抽象表示。抽象语法树以树状的形式展现一个函数中各个执行语句之间的关系,以及执行语句中涉及的变量和常量引用。
S120,确定所述第一任务为可拆分的复合任务时,拆分所述第一任务,得到k个初级子任务;其中,k为正整数,k≥1。
这里,复合任务是相对于原子任务而言的一个概念。本申请实施例中,能够在客户端中实现执行的基础任务被称作原子任务。通常而言,工作流是一种复合任务。原子任务可以实现的功能是一个工作流引擎可以处理的大量工作流中、基本上每个工作流都包含的基本步骤。比如,如果一个工作流引擎可以处理与员工考勤相关的工作流,与员工考勤相关的工作流中,用于请假审批的工作流、用于获取打卡时间的工作流都需要根据员工姓名获取员工工号,那么一个用于根据员工姓名获取员工工号的任务就可以是一个原子任务,一个用于请假审批的任务就是一个复合任务。
一般而言,复合任务由多个原子任务组成,这些原子任务可能处于同一层级中,也可能处于嵌套的各个不同层级中。比如,一个复合任务可能由两个依次执行的原子任务组成,也可能由一个首先执行的原子任务和一个随后执行的复合任务组成,这个随后执行的复合任务拆分得到的子任务又可能包括原子任务和复合任务,如此形成不同层级的原子任务的嵌套。
基于前文所述的复合任务的组成方式,S120中,拆分第一任务之后得到的k个初级子任务中,有可能全部都是原子任务,也有可能既包括原子任务,也包括复合任务。
S130,向对应的客户端发送所述k个初级子任务;其中,初级子任务对应的客户端由所述初级子任务的类型确定。
本申请实施例中,在本地客户端将复合任务拆分之后,会将拆分得到的初级子任务发送给集群中的其他客户端,以实现任务的分布式执行,降低各个客户端处的运算压力。
向外发送某个初级子任务(比如第i初级子任务)之前,本地客户端会先根据第i初级子任务的类型确定第i初级子任务对应的客户端。比如,当第i初级子任务是原子任务时,接收第i初级子任务的客户端如果不能执行第i初级子任务,就需要将第i初级子任务再次转发到下一个客户端。这无疑会造成资源的浪费,降低任务处理的效率。因此,一个客户端向外发送原子任务时,会选择可以执行该原子任务的客户端作为对应的客户端。
当第i初级子任务是复合任务时,由于集群中的所有客户端都具备拆分复合任务的能力,因此,一般而言,一个客户端向外发送复合任务时,可以选择集群中任意一个其他客户端作为对应的客户端。本领域技术人员可以了解,如果选择的这个客户端正在处理其他任务,发送到该客户端的复合任务无疑需要等到该客户端处理完当前任务后才会被处理,这样会降低任务处理的效率,因此,可以选择集群中任意一个空闲的客户端作为对应的客户端。
S140,接收对应的客户端发送的初级子任务的执行结果。
S150,根据各初级子任务的执行结果,确定所述第一任务的第一执行结果。
S160,向所述任务发送端发送所述第一执行结果。
这里,对应的客户端接收到初级子任务、将初级子任务执行完毕之后,会向本地客户端发送执行结果。正如本地客户端将第一任务执行完毕之后,也会向任务发送端发送第一任务的第一执行结果。这是本申请实施例中与任务的分布式执行方式相对应的结果反馈方式。为了获知发出任务的执行结果,相对于任务发送端定期查询数据库的方式,本申请实施例中的任务接收端即时反馈方式可以提高任务的执行效率,减少指令的发送次数,从而节省计算资源。
通常而言,一个复合任务拆分得到的子任务互相之间具有关联。比如,前一个子任务的执行结果可能是后一个子任务执行时需要用到的参数。因此,S150中,确定第一任务的第一执行结果时,需要根据拆分得到的各个初级子任务的执行结果。即,只有当第一任务的所有初级子任务都执行完毕之后,才能得到第一任务的第一执行结果。
实施例二
本申请实施例提供一种任务处理方法,该任务处理方法包括:
S210,接收任务发送端发送的第一任务。
S220,确定所述第一任务为可拆分的复合任务时,拆分所述第一任务,得到k个初级子任务;其中,k为正整数,k≥1。
S230,根据所述k个初级子任务的后置任务确定所述k个初级子任务的发送顺序。
S240,按照所述发送顺序,向对应的客户端发送所述k个初级子任务;其中,初级子任务对应的客户端由所述初级子任务的类型确定。
一般而言,复合任务中的子任务都是按照顺序执行的。比如,一个根据员工姓名查询打卡时间的复合任务中,根据员工姓名查询员工工号的子任务会首先执行,执行结果是员工工号;根据员工工号查询打卡时间的子任务会随后执行,员工工号是该原子任务执行时需要用到的参数。这里,查询员工工号子任务即为查询打卡时间子任务的前置任务,查询打卡时间子任务即为查询员工工号的子任务后置任务。
一个工作流对应的流程规格文件中,每个任务会在目标属性中限定该任务的后置任务。将流程规格文件转换为抽象语法树之后,根据各个抽象语法树中常量、变量的对应关系也可以获知每个任务的前置任务和后置任务。
在一些实施例中,对流程规格文件进行处理时,可以根据任务的目标属性生成一个邻接表,用来记录每个任务的后置任务。客户端之间互相发送任务时,同时也发送这个邻接表,就可以方便每个客户端查找各个任务的后置任务。
S230中,确定k个初级子任务中每个任务的后置任务之后,就可以确定k个初级子任务的执行顺序。这里,将初级子任务发送到对应的客户端即标志着一个初级子任务的执行的开始,因此,k个初级子任务的执行顺序也就是k个初级子任务的发送顺序。根据发送顺序将k个初级子任务发送到对应的客户端即可实现任务的分布式执行。
在一些实施例中,S240包括以下步骤:
S241,按照所述发送顺序排列所述k个初级子任务。
这里,按照发送顺序排列k个初级子任务后会形成一个树状图。如图2所示,每个初级子任务对应树状图中的一个结点,根结点对应最后执行的初级子任务,叶子结点对应最先执行的初级子任务。每个结点连接的上层结点数为该结点对应的初级子任务包含的前置任务的数目,每个结点连接的下层结点数为该结点对应的初级子任务包含的后置任务的数目。比如,k个初级子任务中最后发送的第k初级子任务用于实现税后工资计算,税后工资计算需要用到三个参数,这三个参数分别来自第k初级子任务的三个前置任务,那么按照发送顺序排列这k个初级子任务,第k初级子任务对应的根结点连接的上层结点数就为3。
S242,发送第i初级子任务时,如果第i初级子任务没有前置任务,向对应的客户端发送第i初级子任务;其中,i为正整数,1≤i≤k。
这里,第i初级子任务没有前置任务就意味着第i初级子任务是k个初级子任务中最先执行的初级子任务,对应图2中的叶子结点,此时客户端直接将第i初级子任务发送到对应的客户端。如果S241中得到的树状图有k1个叶子结点,就意味着k个初级子任务中有k1个初级子任务没有前置任务,这k1个初级子任务都将直接被发送到对应的客户端。
S243,如果第i初级子任务有前置任务,获取已经生成的所述第i初级子任务的触发信号的个数,得到第一数值;其中,所述触发信号根据所述第i初级子任务的前置任务的执行结果生成。
S244,确定开始处理所述第i初级子任务之前需要生成的所述第i初级子任务的触发信号的个数,得到第二数值。
S245,确定所述第一数值等于第二数值时,向对应的客户端发送第i初级子任务。
S246,接收到所述第i初级子任务的执行结果后,根据所述执行结果,生成所述第i初级子任务的后置任务的触发信号。
这里,如果第i初级子任务有前置任务,即,第i初级子任务对应的结点不是图2中的叶子结点,表明第i初级子任务的处理需要依赖前置任务的执行结果,此时第i初级子任务需要在本地客户端生成满足条件的触发信号之后才能被发送到对应的客户端。
这里,触发信号根据第i初级子任务的前置任务的执行结果生成。比如,第i-1初级子任务是第i初级子任务的前置任务,第i初级子任务的触发信号需要根据第i-1初级子任务的执行结果生成。而第i-1初级子任务的后置任务除了第i初级子任务,还有第i+1初级子任务。客户端接收到第i-1初级子任务的执行结果之后,确定应该生成第i+1初级子任务对应的触发信号,那么第i初级子任务就不能开始执行。
如果此时本地客户端已经生成第i初级子任务的m1个触发信号,而第i初级子任务的触发属性中定义第i初级子任务需要在本地客户端生成m2个触发信号之后才能开始执行,那么第一数值等于m1,第二数值等于m2。
当客户端确定第一数值等于第二数值时,就向对应的客户端发送第i初级子任务。对应的客户端执行完第i初级子任务后,会将第i初级子任务的执行结果发送给本地客户端,本地客户端根据执行结果,确定生成第i初级子任务的哪个后置任务的触发信号。
在一些实施例中,第二数值可以为1。此时,有可能第i初级子任务只有一个前置任务,也有可能第i初级子任务有至少一个前置任务,但是只要其中任何一个前置任务的执行结果可以使本地客户端生成第i初级子任务的触发信号,第i初级子任务就可以开始执行。
在其他实施例中,第二数值可以等于第i初级子任务的前置任务的个数。此时,只有当第i初级子任务的每个前置任务的执行结果都在本地客户端生成第i初级子任务的一个触发信号后,第i初级子任务才可以开始执行。
S250,接收对应的客户端发送的初级子任务的执行结果。
S260,根据各初级子任务的执行结果,确定所述第一任务的第一执行结果。
S270,向所述任务发送端发送所述第一执行结果。
在一些实施例中,S242和S245中向对应的客户端发送第i初级子任务包括以下步骤:
S247a,如果第i初级子任务有前置任务,判断所述第i初级子任务是否与所述第i初级子任务的前置任务绑定,如果所述第i初级子任务与所述第i初级子任务的前置任务绑定,将接收所述第i初级子任务的前置任务的客户端确定为第一客户端。
S247b,如果所述第i初级子任务未与所述第i初级子任务的前置任务绑定或第i初级子任务没有前置任务,判断所述第i初级子任务为原子任务、不可拆分的复合任务还是可拆分的复合任务,得到第一判断结果。
S247c,如果所述第一判断结果表明所述第i初级子任务为原子任务,判断所述第i初级子任务是否有指定的执行客户端;
如果有,将所述第i初级子任务指定的执行客户端确定为第一客户端;
如果没有,将具有所述第i初级子任务对应的原子任务解释器的客户端确定为第一客户端;其中,所述第i初级子任务对应的原子任务解释器用于执行所述第i初级子任务。
S247d,如果所述第一判断结果表明所述第i初级子任务为不可拆分的复合任务,将具有所述第i初级子任务的全部子任务对应的原子任务解释器的客户端确定为第一客户端。
S247e,如果所述第一判断结果表明所述第i初级子任务为可拆分的复合任务,将所述集群中的一个空闲客户端确定为第一客户端。
S247a到S247e用于确定第i初级子任务对应的客户端。
S247f,向所述第一客户端发送所述第i初级子任务。
实施例三
本申请实施例提供一种任务处理方法,该任务处理方法包括:
S310,接收任务发送端发送的第一任务。
S320,判断所述第一任务是否需要解析。
S330,确定所述第一任务需要解析时,解析所述第一任务。
这里,当任务发送端是任务输入接口时,第一任务以流程规格文件的形式呈现,本地客户端需要将第一任务解析为符号表和抽象语法树。
S340,确定所述第一任务为可拆分的复合任务时,拆分所述第一任务,得到k个初级子任务;其中,k为正整数,k≥1;向对应的客户端发送所述k个初级子任务;其中,初级子任务对应的客户端由所述初级子任务的类型确定;接收对应的客户端发送的初级子任务的执行结果;根据各初级子任务的执行结果,确定所述第一任务的第一执行结果。
这里,S340中的步骤与实施例一中S120到S150相同,用于处理可拆分的复合任务。
S350,确定所述第一任务为原子任务时,判断所述第一任务是否有指定的执行客户端;
如果有,将所述第一任务指定的执行客户端确定为第二客户端;
如果没有,将具有所述第一任务对应的原子任务解释器的客户端确定为第二客户端;其中,所述第一任务对应的原子任务解释器用于执行所述第一任务。
这里,S350限定了当客户端从任务输入接口接收到的第一任务是原子任务时,需要进行的处理。当客户端从任务输入接口接收到第一任务时,首先要对第一任务进行解析,进而才能确定第一任务是一个原子任务。换言之,在能够确定第一任务是一个原子任务之前,客户端已经进行了一些运算处理。因此,为了避免占用本地客户端过多的计算资源,尽量提升任务的分布式执行程度,本地客户端将解析得到的原子任务发送给其他的客户端进行执行。
S360,向所述第二客户端发送所述第一任务。
S370,接收所述第二客户端发送的所述第一任务的第一执行结果。
S380,向所述任务发送端发送所述第一执行结果。
这里,第二客户端中具有第一任务对应的原子任务解释器,即表示第二客户端可以执行第一任务。当第二客户端执行完第一任务,得到第一任务的第一执行结果之后,将第一执行结果发送给本地客户端,本地客户端向任务输入接口发送第一执行结果,标志着整个工作流执行完毕。
实施例四
本申请实施例提供一种任务处理方法,该任务处理方法包括:
S410,接收任务发送端发送的第一任务。
S420,判断所述第一任务是否需要解析。
S430,确定所述第一任务需要解析时,解析所述第一任务。
S440,确定所述第一任务为可拆分的复合任务时,拆分所述第一任务,得到k个初级子任务;其中,k为正整数,k≥1;向对应的客户端发送所述k个初级子任务;其中,初级子任务对应的客户端由所述初级子任务的类型确定;接收对应的客户端发送的初级子任务的执行结果;根据各初级子任务的执行结果,确定所述第一任务的第一执行结果。
S450,确定所述第一任务为不可拆分的复合任务时,向第三客户端发送所述第一任务;其中,所述第三客户端具有所述第一任务的全部子任务对应的原子任务解释器。
S450限定了当客户端从任务输入接口接收到的第一任务是不可拆分的复合任务时,需要进行的处理。不可拆分的复合任务中,所有子任务需要在同一个客户端上执行。一般而言,只有当第一任务的所有子任务都是原子任务时,本地客户端才可确定第一任务是一个不可拆分的复合任务,并针对每个子任务分别确定可以执行该子任务的客户端。
本领域技术人员可以了解,一个具有一定规模的集群需要同时处理多个工作流。为了提升工作流的处理效率,需要将一个原子任务对应的原子任务解释器加载在集群中的至少一个客户端上,以使得不同工作流中相同的原子任务可以同时执行。因此,第一任务的每个子任务对应的客户端都是一个包括了至少一个客户端的集合,本地客户端对这些集合求交集,得到的交集中的客户端即可以执行第一任务的所有子任务。本地客户端就可以将该交集中的某个客户端确定为第三客户端,然后向第三客户端发送第一任务。
S460,接收所述第三客户端发送的所述第一任务的第一执行结果。
S470,向所述任务发送端发送所述第一执行结果。
实施例五
本申请实施例提供一种任务处理方法,该任务处理方法包括:
S510,接收任务发送端发送的第一任务。
S520,判断所述第一任务是否需要解析。
S530,确定所述第一任务不需要解析、且所述第一任务为原子任务时,利用所述第一任务对应的原子任务解释器执行所述第一任务,得到所述第一任务的第一执行结果。
这里,当任务发送端是集群中的其他客户端时,第一任务以抽象语法树的形式呈现,本地客户端不需要解析第一任务。
S530限定了当客户端从集群中的其他客户端接收到的第一任务是原子任务时,需要进行的处理。集群中其他客户端之所以将第一任务发送到本地客户端,是因为确定本地客户端中具有第一任务对应的原子任务解释器,可以执行第一任务。如果此时本地客户端再将第一任务转发到其他客户端,将启动不必要的数据传输过程,浪费***资源,降低任务处理的效率。因此,为了提升任务处理的效率,本地客户端将直接利用第一任务对应的原子任务解释器执行第一任务,并得到第一执行结果。
S540,确定所述第一任务为可拆分的复合任务时,拆分所述第一任务,得到k个初级子任务;其中,k为正整数,k≥1;向对应的客户端发送所述k个初级子任务;其中,初级子任务对应的客户端由所述初级子任务的类型确定;接收对应的客户端发送的初级子任务的执行结果;根据各初级子任务的执行结果,确定所述第一任务的第一执行结果。
S550,向所述任务发送端发送所述第一执行结果。
实施例六
S610,接收任务发送端发送的第一任务。
S620,判断所述第一任务是否需要解析。
S630,确定所述第一任务不需要解析、且所述第一任务为不可拆分的复合任务时,拆分所述第一任务,得到至少两个初级子任务。
S640,利用每个初级子任务对应的原子任务解释器执行所述至少两个初级子任务中的每个初级子任务,得到每个初级子任务的执行结果。
S650,根据各初级子任务的执行结果,确定所述第一任务的第一执行结果。
S630到S650限定了当客户端从集群中的其他客户端接收到的第一任务是不可拆分的复合任务时,需要进行的处理。如实施例四中所述的,只有当一个复合任务的所有子任务都是原子任务时,客户端才能判断该复合任务是一个不可拆分的复合任务。由此可见,本地客户端接收到的第一任务的子任务都是原子任务。如果第一任务拆分之后只得到一个子任务,那么第一任务实际上就是一个原子任务,而不是一个不可拆分的复合任务。因此,可以推断得出,第一任务拆分之后将得到至少两个初级子任务。
本地客户端之所以会接收到第一任务,是因为发送第一任务的客户端进行了实施例四中记载的判断过程,意味着本地客户端中具有第一任务的每个初级子任务对应的原子任务解释器。因此,只要依次利用每个初级子任务对应的原子任务解释器对初级子任务进行执行,就可以得到第一任务的第一执行结果。
S660,确定所述第一任务为可拆分的复合任务时,拆分所述第一任务,得到k个初级子任务;其中,k为正整数,k≥1;向对应的客户端发送所述k个初级子任务;其中,初级子任务对应的客户端由所述初级子任务的类型确定;接收对应的客户端发送的初级子任务的执行结果;根据各初级子任务的执行结果,确定所述第一任务的第一执行结果。
S670,向所述任务发送端发送所述第一执行结果。
实施例七
本申请实施例提供一种任务处理方法,该方法处理的对象为工作流。在本申请实施例中,工作流表现为一个复合任务。该方法应用于处理工作流的集群中的客户端。这里,集群表现为一个分布式***,客户端位于分布式***中的多台设备上。集群中的各个客户端之间可以传递信息,以及发送任务和执行结果。每个客户端中包含了各种不同的功能模块,分别用于与其他客户端之间传递信息、任务和执行结果,或者拆分和执行接收到的任务。
本申请实施例中,工作流作为一个复合任务被记录在流程规格文件中。流程规格文件是一个文本文件,根据流程规格文件的特定文档结构,将工作流记录在流程规格文件中,可以清晰地展现工作流中各个任务可以实现的功能,以及各个任务之间的依赖关系。通过各个任务的目标指向,还可以展现工作流中包含的流程的执行顺序。如下所示的流程规格文件中展现了工作流的一个示例:
如上述流程规格文件所示,该复合任务的任务名字为示例工作流,包括三个原子任务,定义在该复合任务的任务属性中,三个原子任务的任务名字分别为监控文件、合并和装载。示例工作流为监控文件、合并和装载三个任务的父任务,监控文件、合并和装载三个任务为示例工作流的子任务。
为了降低每个客户端上执行的任务的复杂程度,本申请实施例中将操作基本、重复率高的简单任务定义为原子任务,一个原子任务对应的简单操作可能被包含在很多复杂的工作流中。通过将工作流对应的复合任务拆分为原子任务的组合,就可以将原子任务派发到不同的客户端上执行,从而降低每个客户端上的运算压力。此外,不同的工作流可能拆分得到一些相同的原子任务,来自不同工作流的原子任务可以被派发到同一个客户端上执行,因此不需要在不同的客户端上重复执行相同的原子任务,从而节省客户端的计算资源。
复合任务没有类型属性但含有任务属性。一个复合任务本身并不会实际执行某项操作,只形成一层嵌套的作用域。该嵌套的作用域可以实现以下功能:
第一,提供符号表作用域,父任务的配置属性中定义的变量可以在子任务中使用。
在计算机科学中,符号表是一种用于语言翻译器(例如编译器和解释器)的数据结构。在符号表中,程序源代码中的每个标识符都和它的声明或使用信息绑定在一起,比如其数据类型、作用域以及内存地址。这里,作用域用于限定一段程序代码中所用到的名字有效/可用的代码范围。
比如,复合任务示例工作流的配置属性中定义了workingDir(workingdirection,工作路径)这个变量,监控文件任务位于示例工作流的任务属性中,那么监控文件任务中可以引用workingDir这个变量来定义监控目录——“监控目录:${workingDir}/ftp”,而不需要输入“workingDir”这个变量的值。
第二,提供一种对生命周期的定义。
比如,一个名字为抽取文件的原子任务的执行结果包括生成一个临时文件,抽取文件任务的父任务的配置属性中定义了该临时文件的路径信息,那么该父任务的子任务中,抽取文件任务的所有后置任务都可以通过引用该路径信息来使用该临时文件。当这个父任务执行结束后,该父任务形成的作用域也随之消失,该临时文件将被删除,该临时文件的生命周期自此结束。
第三,提供一种复用工作流的方式。
比如,某个父任务中包括抽取和装载两个子任务,抽取任务用于从抽取路径处提取文件,装载任务用于将文件加载到装载路径处。这样,包含了这两个任务的父任务实际上可以用于将抽取路径处的文件加载到装载路径处,完成的是文件迁移的操作。通过在这个父任务的配置属性中分别定义变量抽取路径extract.dir和装载路径load.dir:
load.dir:/load/20190413,
extract.dir:/extract/20190412,
该父任务就可以在其他工作流中作为“文件迁移”这个任务直接被引用。引用该父任务的其他任务只需要在该父任务的配置属性中限定抽取路径和装载路径,该父任务即可执行将文件从抽取路径迁移到装载路径的动作。
相应地,基于嵌套的作用域的第一个功能,抽取任务可以通过“${extract.dir}”这一语句来引用抽取路径,装载任务可以通过“${load.dir}”这一语句来引用装载路径。
不同于复合任务,原子任务是具有类型属性的任务。一个客户端可以根据某个原子任务的类型标识将此原子任务对应的抽象语法树与符号表发送到可以处理该原子任务的对应客户端,从而在该对应客户端实现对原子任务的执行。
除了以上复合任务或原子任务各自的属性,复合任务与原子任务还包括如下共同属性:
属性一:名字,即任务的名字。为了避免在引用中发生混淆,同一个复合任务下,每个任务的名字不可重复。
属性二:路由,即任务的路由方式。这里,路由方式可以配置为默认方式或指定方式。如果一个任务中,没有对路由这一属性进行限定,则表明该任务的路由方式为默认方式,那么该任务可以被发送到任意一个可以执行这个任务的客户端。如果一个任务中,限定了执行该任务的客户端,那么该任务只能被发送到路由属性中指定的客户端上。
比如,上述流程规格文件中,合并这一原子任务的路由属性没有被特别限定,表明这个原子任务可以被派发到任意能够执行它的客户端;监控文件这一原子任务的路由属性中,限定了客户端B,即表明该任务只能被派发到客户端B上。
属性三:目标,限定了该任务的后置任务,表明该后置任务需要在该任务执行完毕之后开始执行。在一些实施例中,该任务执行完毕之后,只有满足一定的触发条件,才向该后置任务发送触发信号。即,一个任务的目标属性中,可以同时限定该任务的后置任务,以及向该后置任务发送触发信号的条件。
比如,上述流程规格文件中,监控文件这一原子任务的目标属性中,定义了合并和装载两个原子任务。合并任务对应了一个触发信号发送条件:avg(file.sizes)<10,表明监控文件任务执行完毕之后,当文件的数量小于10时,向合并任务发送触发信号;装载任务对应了一个触发信号发送条件:otherwise(其他),表明监控文件任务执行完毕之后,当文件的数量大于或等于10时,向装载任务发送触发信号。
在一些实施例中,可以提取一个工作流中所有任务的目标属性。基于这些任务的名字与目标属性的对应关系,可以生成一个体现工作流中所有任务的执行顺序的树状图。本申请实施例中,工作流中的每个子任务开始执行时,都会被发送到相应的客户端。因此,任务的执行顺序即为任务的发送顺序。在一些实施例中,可以基于该树状图中的执行顺序信息,生成一个邻接表。那么,在需要的时候,就可以从该邻接表中查找得到任意一个任务的前置任务和后置任务。
属性四:配置。每个任务都可以在自己的配置属性中定义变量和函数。
复合任务的配置属性中的变量可以由该任务本身引用,也可以由该任务的子任务引用。
比如,上述流程规格文件中,监控文件任务、装载任务、合并任务是示例工作流的子任务。监控文件任务和装载任务中,引用了复合任务示例工作流的配置属性中定义的变量“workingDir”。
原子任务的配置属性中的内容可以被该原子任务对应的原子任务解释器引用。该原子任务解释器对应于一段可执行代码,执行这段代码,即相当于执行该原子任务。原子任务解释器在引用该原子任务的配置属性后,将配置属性中的内容解析为可执行代码可以识别的内容。
属性五:触发,触发属性用于限定该任务的触发方式。触发属性对应的配置有两种,一种为“任一”,表示该任务接收到任意一个前置任务的触发信号之后即可执行;另一种为“全部”,表示该任务需要接收到所有的前置任务的触发信号之后才可以执行。这里,两个按照先后顺序执行的任务中,先执行的任务为后执行的任务的前置任务,后执行的任务为先执行的任务的后置任务。
比如,上述流程规格文件中,监控文件任务具有两个后置任务,分别为合并任务和装载任务;合并任务具有一个后置任务,为装载任务。那么,对应地,装载任务即有两个前置任务,分别为监控文件任务和合并任务。装载任务的触发属性限定的触发方式是“任一”,那么,装载任务接收到监控文件任务和合并任务中的任意一个发送的触发信号,即可开始执行。
为了执行本申请实施例中的任务处理方法,客户端需要包括对应的功能模块。图3为本申请实施例中客户端的一个示例,该客户端300包括协调器301、看守器302、解析器303、分解器304、执行器305、触发器306、发射器307和解释器308,其中:
协调器301,用于接收和发送任务,以及接收和发送执行结果。这里,客户端300通过协调器301来实现任务的统一接收和统一发送。协调器301接收的任务可以是集群中其他客户端的协调器发送的原子任务或复合任务,也可以是用户从任务输入接口输入的流程规格文件,还可以是从客户端300内部的看守器302发送的原子任务或复合任务。协调器301可以向集群中其他客户端的协调器发送任务,也可以向客户端300内部的看守器302发送任务。协调器301发送的任务可以是原子任务或复合任务。
换言之,客户端300与集群中的其他客户端或者任务输入接口之间的任务收发由协调器301执行,协调器301是任务的外部流转接口;客户端300内各个模块之间的任务收发由看守器302执行,看守器302是任务的内部流转接口;协调器301与看守器302之间的任务传递发生在任务由客户端300的外部发送到客户端300时,或者任务在客户端300内处理完毕,需要被发送到集群中其他客户端时。
在用户从任务输入接口向集群输入流程规格文件之前,客户端300已经通过协调器301将客户端300可以处理的原子任务类型发送到了集群中其他客户端的协调器。对应地,集群中其他客户端的协调器也将自身可以处理的原子任务类型发送到了协调器301,协调器301将接收到的原子任务类型和发送该原子任务类型的客户端之间的第一映射关系保存起来。
当客户端300需要向外发送一个原子任务时,看守器302将原子任务发送到协调器301,协调器301根据第一映射关系将原子任务发送到对应客户端的协调器。其中,原子任务类型即为上述流程规格文件中,类型属性记录的信息,比如,监控文件这一原子任务的原子任务类型为file.watcher。
对应地,集群中其他客户端的协调器可以根据自身保存的第一映射关系向客户端300的协调器301发送原子任务。因此协调器301从客户端300的外部接收到的任务可能是原子任务。
当客户端300需要向外发送一个复合任务时,看守器302将复合任务发送到协调器301,协调器301可以将复合任务发送到集群中空闲的客户端,空闲的客户端将对该复合任务进行拆分和再次发送。客户端的协调器可以通过与其他客户端的协调器之间的信息交互,获知哪些客户端是空闲的。
对应地,集群中其他客户端的协调器也可以在客户端300空闲时,将复合任务发送到协调器301。因此协调器301从集群中其他客户端的协调器接收到的任务也可能是复合任务。
当用户从任务输入接口向集群输入流程规格文件时,可以选择客户端300来接收该流程规格文件,此时协调器301从客户端300的外部接收到的任务即为流程规格文件中记载的工作流。
本申请实施例中,根据第一映射关系,客户端300中的协调器301可以决定将一个原子任务发送到哪个客户端上,从而使得工作流中的原子任务可以在不同的客户端上得到处理,实现任务的分布式执行,从而简化开发难度。
此外,协调器301还用于为每个从客户端300外部接收到的任务创建一个看守器302,并为该任务分配资源池。
其中,资源池用于存储该任务的符号表,符号表中包括变量和对应的变量值等信息。资源池为该任务的子任务提供统一的资源访问与注册地址,一方面,接受到其他客户端发送的该任务的子任务的执行结果之后,该任务可以根据子任务的执行结果,对资源池中的变量值或其他数据进行更新;另一方面,该任务中,正在其他客户端上执行的子任务可以引用符号表中的数据,来对自身的变量等信息进行解释。
此外,当客户端300执行一个任务,得到执行结果后,协调器301可以将该执行结果发送到该任务的发送端。这个发送端可以是任务输入接口,也可以是集群中其他的客户端。
当客户端300向外发送一个任务,协调器301用于接收该任务的执行结果,并将执行结果发送到看守器302。
看守器302,用于根据接收到的任务的类型,将该任务发送到协调器301、解析器303、分解器304或执行器305;还用于根据触发器306发送的执行信号,将该执行信号对应的任务发送到协调器301;还用于将接收到的执行结果发送到发射器307。
如果看守器302从协调器301接收到流程规格文件,则看守器302将该流程规格文件发送到解析器303;如果看守器302从协调器301接收到复合任务,则看守器302将该复合任务发送到分解器304;如果看守器302从协调器301接收到原子任务,则看守器302将该原子任务发送到执行器305。
如果看守器302从解析器303接收到原子任务或者不可拆分的复合任务,则看守器302将该原子任务或者不可拆分的复合任务发送到协调器301。
如果看守器302从解析器303接收到可拆分的复合任务,则看守器302将该复合任务发送到分解器304。
如果看守器302从分解器304接收到原子任务或复合任务,则看守器302将该原子任务或复合任务发送到协调器301。
如果看守器302从触发器306接收到执行信号,则将该执行信号对应的任务发送给协调器301。
如果看守器302从协调器301接收到执行结果,则将该执行结果发送到对应的发射器307。
本申请实施例中,每个从客户端300的外部发送到协调器301的任务会被协调器301转发到看守器302,看守器302用于协调该任务在客户端300内部的传递。
如果该任务是从协调器301接收到的流程规格文件,那么该流程规格文件需要在客户端300中被解析为符号表和抽象语法树,以方便在客户端之间、或者客户端的各个功能模块之间进行传递,因此看守器302将该流程规格文件发送到解析器303进行解析。
如果该任务是从协调器301接收到的复合任务,那么该复合任务需要在客户端300中被拆分为次一级的子任务,因此看守器302将该复合任务发送到分解器304进行分解。
如果该任务是从协调器301接收到的原子任务,那么该原子任务需要在客户端300中执行,因此看守器302将该原子任务发送到执行器305中进行执行。
如果该任务是从解析器303或者分解器304接收到的原子任务或者复合任务,那么该任务需要被发送到其他客户端进行执行,因此看守器302将该任务发送到协调器301、通过协调器301向外发送。
解析器303,用于将流程规格文件转化为以符号表和抽象语法树的形式表示的任务,并将解析后的任务发送到看守器302。
本申请实施例中,任务在各个客户端之间、或者在客户端内的各个功能模块进行发送时表现为抽象语法树的形式。在计算机科学中,抽象语法树(Abstract Syntax Tree,AST)是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个结点都表示源代码中的一种结构。
解析器303可以是一种编译器,用于将用户从任务输入接口输入的流程规格文件转化为符号表和抽象语法树,并将以符号表和抽象语法树表示的任务发送到看守器302。这样,看守器302可以将该任务发送到协调器301,协调器301根据该任务的类型将该任务发送到对应的客户端。
一般而言,只有当协调器从任务输入接口接收流程规格文件时,解析器才会执行任务解析的操作。协调器从其他客户端的协调器接收到的任务都是以符号表和抽象语法树的形式表示,此时解析器不需要对任务进行解析。
分解器304,用于接受复合任务、将复合任务拆分为至少一个次一级的子任务,并将拆分得到的子任务发送到看守器302。
比如:一个复合任务由两个原子任务和一个复合任务组成,那么看守器302从协调器301中接收到该复合任务,并将该复合任务发送到分解器304。分解器304会将该复合任务拆分为两个原子任务和一个复合任务,并将两个原子任务和一个复合任务发送到看守器302中。
分解器304只对复合任务执行一次拆分的操作,然后将拆分得到的子任务发送到看守器302中。如果一个复合任务中有五层嵌套,在第一个客户端的分解器执行了一次拆分之后,得到的子任务中嵌套数最多的子任务将只包括四层嵌套,然后被发送到第二个客户端中。这样,依次在不同的客户端中进行随后的四次拆分之后,该复合任务的嵌套即可以被全部解开,组成该复合任务的所有原子任务都可以在对应的客户端中得到执行。
执行器305,用于执行原子任务,并将该原子任务的执行结果发送给该原子任务的父任务所在的客户端。
一般而言,原子任务对应的抽象语法树中包括需要数值化的变量、常量等部分,还有可能包括内置函数。执行器305接收到原子任务的抽象语法树和符号表之后递归检查该语法树,首先将符号表和抽象语法树发送到通用解释器将变量、常量进行解释,得到变量和常量对应的数值,然后将符号表和抽象语法树发送到内置函数解释器解释内置函数,最后将符号表和抽象语法树发送到原子任务解释器将原子任务整体进行解释。经过这种递归解释,该原子任务即可在原子任务解释器中被解释为可执行代码可以识别的内容。
该原子任务执行完毕之后,执行器305将该原子任务的执行结果发送给看守器302。
触发器306,用于在接收到满足条件的触发信号之后转换到触发后状态,并向看守器302发送执行信号。
这里,触发器306可以是“任一”触发器或者“全部”触发器。图4示出了“任一”触发器的触发过程,图5示出了“全部”触发器的触发过程。
如图4所示,“任一”触发器存在两种状态:触发前和触发后。触发前状态为“任一”触发器的初始化状态,“任一”触发器接受到来自任意一个前置任务的触发信号后即进入触发后状态,并向看守器302发送执行信号,使得看守器302开始处理该“任一”触发器对应的任务,并忽略所有后续的触发信号。
比如,上述流程规格文件中,装载任务限定的触发方式为任一,那么该任务对应的触发器即为“任一”触发器。该触发器接收到装载任务的前置任务(监控文件任务和合并任务)中的任意一个发送的触发信号,即可以从触发前状态转换为触发后状态。当该“任一”触发器转换到触发后状态之后,即向看守器302发送执行信号,使得看守器302开始处理装载任务。
如图5所示,“全部”触发器包括一个触发信号存储列表,该列表的条目数与“全部”触发器对应的任务的前置任务个数相同,用于存储该任务的所有前置任务的ID如id0、id1、……、idn和触发信号ST0、ST1、……、STn。当“全部”触发器处于初始化状态时,该列表为空。“全部”触发器每接收到一个前置任务的触发信号,即将该触发信号存入触发信号存储列表。当触发信号存储列表中不存在空条目时,“全部”触发器即从触发前状态进入触发后状态,并向看守器302发送执行信号,使得看守器302开始处理该“全部”触发器对应的任务。
在一些实施例中,触发信号可以是前置任务的执行结果。当触发信号存储列表中存储了所有的前置任务的ID和执行结果ST之后,“全部”触发器将所有前置任务的执行结果与当前作用域的符号表结合,生成执行信号,发送给看守器302。
比如,如果上述流程规格文件中,如果装载任务的触发属性限定的触发方式是“全部”,那么,该任务对应的触发器即为“全部”触发器。该触发器包括一个触发信号存储列表,条目数为2。该触发器接收到监控文件任务的触发信号后,将该触发信号存入触发信号存储列表。此时列表中的空条目数为1,触发器将继续等待触发信号。该触发器接收到合并任务的触发信号后,将该触发信号存入触发信号存储列表。此时列表中的空条目数为0,触发器由触发前状态进入触发后状态,并向看守器302发送执行信号。
发射器307,用于接收任务的执行结果,并根据执行结果和触发信号发送条件判断生成哪一个后置任务的触发信号。这里,用户可以定义一个断言函数作为触发信号发送条件。发射器307将执行结果和触发信号发送条件发送到解释器308,解释器308将执行结果和触发信号发送条件进行解释,得到一个判断结果。发射器307根据判断结果决定生成哪一个后置任务的触发信号,并将触发信号发送给该后置任务对应的触发器。如果当前执行完毕的任务仅有一个后置任务,则发射器307直接生成该唯一的后置任务的触发信号。如果当前执行完毕的任务没有后置任务,则发射器307不生成触发信号。
比如,上述流程规格文件中,监控文件任务的目标属性中限定了后置任务的触发信号发送条件:avg(file.sizes)<10。avg(file.sizes)<10是一个断言函数。当监控文件任务执行完毕后,监控文件任务的发射器得到执行结果,调用解释器来解释avg(file.sizes)<10,得到判断结果。如果判断结果为真,那么发射器生成合并这个后置任务的触发信号;如果判断结果为假,那么发射器生成装载这个后置任务的触发信号。
在一些实施例中,发射器与后置任务的触发器连接,用于向后置任务的触发器发送触发信号。比如,上述流程规格文件中,监控文件任务的发射器分别连接合并任务和装载任务的触发器,根据判断结果来向其中一个触发器发送触发信号。
解释器308,用于将抽象语法树和符号表解释为可执行代码可以识别的内容,或者将可执行代码的执行结果转换为抽象语法树。
这里,解释器可以是一种编译器,用于从抽象语法树中提取信息,并将提取到的信息转换为可执行代码的输入。通用解释器用于将变量引用、常量等部分解释为对应的值,内置函数解释器用于将内置函数解释为可执行代码可以识别的内容,原子任务解释器用于将原子任务对应的抽象语法树解释为可执行代码可以识别的内容,并将可执行代码的执行结果转换为抽象语法树。
本申请实施例中,通过为集群中每个客户端分配各自需要执行的原子任务,可以将一个原子任务所需的可执行代码和解释器只加载在固定的几个客户端中,从而通过客户端之间的数据传递来实现任务的定向派发,可以避免在大量客户端中没有规律地加载相同的可执行代码和解释器造成的资源浪费,提高客户端的利用效率。
本申请实施例提供的任务处理方法包括以下步骤:
S701,集群内的每个客户端将自身注册到集群内的其他客户端上。
该步骤包括以下子步骤:
S701a,集群内的每个客户端广播自身的客户端名字和客户端地址。
S701b,集群内的每个客户端加载各自安装的解释器,并广播解释器的类型;其中,解释器包括原子任务解释器与内置函数解释器,解释器类型为解释器对应的原子任务或内置函数的类型。
S701c,集群中的其他客户端接收到广播消息,存储客户端名字与解释器类型之间的第一映射关系、客户端名字与客户端地址之间的第二映射关系。
这里,原子任务解释器是客户端中用于处理原子任务的模块,内置函数解释器是客户端中用于处理内置函数的模块。比如,上述流程规格文件中,监控文件、合并、装载均为原子任务;装载任务的配置属性中,sum()是一个内置函数,该内置函数用于确定文件的总个数。如图6所示,客户端C安装了load.hdfs和function.avg对应的解释器,那么客户端C就可以处理装载这一原子任务和avg()这一内置函数,客户端C加载的解释器类型即为“load.hdfs”和“function.avg”。客户端A加载的解释器类型也为“load.hdfs”和“function.avg”,客户端B加载的解释器类型为“file.watcher”和“merge.local”。
图6还示出了客户端之间互相广播通知原子任务解释器类型和内置函数解释器类型的流程。客户端C可以处理装载这一原子任务,可以处理avg()这一内置函数。因此,客户端C广播装载任务的类型标识“load.hdfs”和avg()函数的类型标识“function.avg”,客户端A和客户端B将与客户端C相关的两个第一映射关系进行存储,这两个第一映射关系分别为客户端C的名字与“load.hdfs”这一解释器类型的映射关系、和客户端C的名字与“function.avg”这一解释器类型的映射关系。客户端B可以处理监控文件和合并这两个原子任务,那么,客户端B广播监控文件和合并这两个任务的类型标识“file.watcher”和“merge.local”,客户端C和客户端A将与客户端B相关的两个第一映射关系进行存储。客户端A可以处理装载这一原子任务和avg()这一内置函数。因此,客户端A广播装载任务的类型标识“load.hdfs”和avg()函数的类型标识“function.avg”,客户端C和客户端B将与客户端A相关的两个第一映射关系进行存储。
在一些实施例中,客户端C将第一映射关系存储在协调器中,如图6所示。协调器是客户端中用于维护第一映射关系的模块。
在一些实施例中,客户端只广播原子任务解释器的类型。为了解释一个原子任务,客户端中需要加载对应的原子任务解释器,如果原子任务中包含内置函数,客户端中还需要加载对应的内置函数解释器。由此可见,在一个客户端中如果包括一个原子任务解释器,一般情况下也包括解释该原子任务时所需的内置函数解释器。因此,客户端在广播解释器类型的时候,也可以只广播原子任务解释器的类型。
此外,集群中的每个客户端还将自己的客户端名字和客户端地址向集群中的其他客户端广播,从而将自身的客户端名字和客户端地址注册到集群中的其他客户端上。这样,集群中的每个客户端中都存储有其他客户端的名字和地址之间的第二映射关系。
本申请实施例中,第二映射关系存储在协调器中。比如,客户端C的协调器中还存储了客户端B的名字与客户端B的地址之间的第二映射关系,这样,客户端C需要将监控文件这个原子任务发送到其他客户端时,客户端C的协调器根据监控文件这个名字与客户端B的名字之间的第一映射关系,可以确定需要将监控文件这个原子任务发送到客户端B;选定了客户端B来接收监控文件任务之后,客户端C的协调器再根据客户端B的名字与客户端B的地址之间的第二映射关系,确定监控文件这个原子任务的发送地址,从而将监控文件这个原子任务发送到客户端B。
本申请实施例中,集群中的每个客户端都保存了其他客户端的名字和地址之间的第二映射关系,还保存了其他客户端的名字和可以处理的原子任务和内置函数之间的第一映射关系。这样,每个客户端都可以根据保存的这些信息向其他客户端派发相应的任务,以实现任务的分布式处理,提高任务的处理效率。
S702,第一客户端701的第一协调器704接收到第一任务后,创建第一任务对应的第一看守器702,并将第一任务发送到第一看守器702。
如图7所示,第一客户端701的第一协调器704从任务输入接口接收到第一任务之后,创建一个对应于第一任务的第一看守器702。这里,第一任务是一个流程规格文件。
S703,第一协调器704为第一任务分配第一资源池。
这里,第一协调器704根据流程规格文件的大小,依据经验值确定第一资源池的大小、为第一任务分配第一资源池。第一资源池用于保存第一任务中的符号表。这样,第一任务中的所有子任务可以读取该符号表中的常量和变量对应的数值,第一任务还可以根据各个子任务的执行结果可以对符号表中的常量和变量对应的数值进行更新。
S704,第一看守器702将第一任务发送到第一解析器703,第一解析器703将第一任务解析为符号表和抽象语法树,第一解析器703将第一任务对应的符号表和抽象语法树发送到第一看守器702。
一般而言,任务在客户端之间进行发送的时候,都是以抽象语法树的形式存在。因此,在一个工作流被处理的过程中,只有接收到该工作流对应的流程规格文件的客户端需要调用解析器将流程规格文件解析为抽象语法树。
S705,第一看守器702根据第一任务的类型,将符号表和第一任务的抽象语法树发送给第一协调器704或第一分解器705。
第一看守器702根据第一任务的抽象语法树,确定第一任务的类型。如果第一任务是不可拆分的复合任务或原子任务,则第一看守器702将符号表和第一任务的抽象语法树发送给第一协调器704;如果第一任务是可拆分的复合任务,则第一看守器702将符号表和第一任务的抽象语法树发送给第一分解器705。
在一个工作流中,如果一个复合任务的子任务对其前置任务的执行结果的依赖程度非常高,那么这个复合任务的两个子任务需要在同一个客户端中执行。此时,该复合任务即为一个不可拆分的复合任务。
S706,第一分解器705将第一任务拆分为次一级的第一初级子任务、……、第i初级子任务、……、第k初级子任务,并将k个初级子任务发送到第一看守器702;其中,i、k为正整数,1≤i≤k,k≥1。
这里,第一分解器705用于将复合任务拆分,得到k个次一级的初级子任务,然后将k个初级子任务发送到看守器702。第一客户端701中,只对第一任务进行一次拆分。如果拆分得到的k个初级子任务中包括复合任务,那么第一客户端701的第一协调器704将k个初级子任务中的复合任务发送给下一个客户端,在下一个客户端的分解器中进行该复合任务的第二次拆分。如此继续,通过多个客户端中分解器的层层拆分,可以将一个复合任务拆分为多个原子任务的嵌套组合,从而利用相应的原子任务解释器来执行原子任务。
本申请实施例中,每个客户端处只将复合任务拆分为次一级的子任务,使得父任务和子任务之间的跟踪路径更为简洁清晰。同时,将复合任务的多层拆分操作按照复合任务的嵌套层次分布在不同客户端的分解器中执行,可以减小每个客户端的运算压力,提高任务处理速度。
S707,第一看守器702根据第i初级子任务的入度和出度,创建第i初级子任务对应的第i初级触发器706和第i初级发射器707。
如果第i初级子任务的入度为0,出度不为0,则第i初级触发器706为特殊触发器,该第i初级发射器707为普通发射器。
如果第i初级子任务的出度为0,入度不为0,则第i初级触发器706为普通触发器,该第i初级发射器707为特殊发射器。
如果第i初级子任务的入度和出度均不为0,则第i初级触发器706为普通触发器,第i初级发射器707为普通发射器。
如果第i初级子任务的入度和出度均为0,则第i初级触发器706为特殊触发器,第i初级发射器707为特殊发射器。
这里,一个任务的入度用于表示该任务的前置任务的个数,一个任务的出度用于表示该任务的后置任务的个数。第一看守器702可以通过对邻接表中该任务的前置任务和后置任务的信息进行统计得到一个任务的出度和入度的数值。在其他实施例中,也可以在根据任务的目标属性生成邻接表时直接对任务的出度和入度进行统计并保存,第一看守器702可以直接读取统计得到的任务的出度和入度的数值。
特殊触发器对应的任务的入度为0,特殊触发器接收来自看守器发送的触发信号;普通触发器对应的任务的入度大于0,普通触发器接收来自前置任务的普通发射器发送的触发信号。
特殊发射器对应的任务的出度为0,特殊发射器不向外发送触发信号;普通发射器对应的任务的出度大于0,普通发射器在触发信号发送条件满足时向后置任务的普通触发器发送触发信号。
第一看守器702在创建k个初级触发器和k个初级发射器时,还将第i-1初级子任务的第i-1初级发射器与第i初级子任务的第i初级触发器706相连接,使得第i-1初级发射器在触发信号发送条件满足时可以向第i初级触发器706发送触发信号。这里,第i-1初级子任务是第i初级子任务的前置任务。
比如,上述流程规格文件中,监控文件任务的目标属性中定义了合并和装载两个任务,合并任务的目标属性中定义了装载任务,而装载任务没有对其目标属性进行限定。因此,该工作流中,监控文件任务的后置任务是合并和装载两个任务,出度为2;合并任务的后置任务是装载任务,出度为1;装载任务没有后置任务,出度为0。对应地,监控文件任务的入度为0;合并任务的前置任务是监控文件任务,入度为1;装载任务的前置任务是监控文件任务和合并任务,入度为2。
根据以上的出度和入度数值,对于监控文件任务,看守器创建特殊触发器和普通发射器;对于装载任务,看守器创建普通触发器和特殊发射器;对于合并任务,看守器创建普通触发器与普通发射器。监控文件任务的普通发射器连接合并任务的普通触发器和装载任务的普通触发器,合并任务的普通发射器连接装载任务的普通触发器。
S708,第i初级触发器706被触发后,向第一看守器702发送第i执行信号,所述第i执行信号用于使第i初级子任务开始执行。
这里,第i初级触发器706如果是特殊触发器,第一看守器702创建了第i初级触发器706之后,将直接向第i初级触发器706发送触发信号。在一个复合任务中,多个子任务按照一定的顺序依次执行。一个复合任务中,没有前置任务的子任务为头部子任务。第一看守器702首先启动该复合任务中所有头部子任务的执行。头部子任务执行完毕之后,向其后置任务的触发器发送触发信号,这样,头部子任务的后置任务才会开始执行。
第i初级触发器706如果是普通触发器,则将收到第i初级子任务的前置任务的触发信号。第i初级触发器706可能是“任一”触发器或者“全部”触发器。第i初级触发器706接收到触发信号之后,如果确定触发信号足以使其由触发前状态转换为触发后状态,则第i初级触发器706被触发,并向第一看守器702发送第i执行信号。
比如,上述流程规格文件中,监控文件任务执行完毕后,该任务对应的普通发射器将会向合并任务对应的普通发射器发送触发信号。合并任务只有一个前置任务,监控文件任务发送的触发信号足以触发该任务对应的普通触发器,此时合并任务对应的普通触发器将向看守器发送执行信号。
S709,第一看守器702接收到第i初级触发器706发送的第i执行信号后,将第i执行信号对应的第i初级子任务发送给第一协调器704。
这里,将一个任务发送到协调器,即意味着该任务将被发送到对应的客户端进行执行或者拆分,从而启动该任务的执行过程。
S710,第一协调器704根据任务发送规则,将符号表和第一任务或第i初级子任务对应的抽象语法树发送到对应的客户端。
这里,如果第一任务是一个不可拆分的复合任务或者是一个原子任务,第一协调器704向外发送的任务是第一任务本身;如果第一任务是一个可拆分的复合任务,第一协调器704向外发送的任务是第一任务拆分后得到的第i初级子任务。
任务发送规则规定了第一协调器704如何将任务发送到对应的客户端,包括以下规则:
如果该任务为原子任务,第一协调器704首先根据该原子任务的路由属性判断该原子任务有没有指定客户端。
如果有指定客户端,则第一协调器704根据该原子任务的类型标识在保存的第一映射关系中查询该指定客户端是否可以执行该原子任务,如果可以,第一协调器704将该原子任务发送到该指定客户端;如果不可以,第一协调器704通知第一看守器702任务发送失败。
如果没有指定客户端,则第一协调器704根据该原子任务的类型标识在保存的第一映射关系中查询可以执行该原子任务的客户端,并将该原子任务发送到其中一个空闲的客户端。如果所有客户端均不处于空闲状态,则第一协调器704通知第一看守器702任务发送失败。
如果该任务为不可拆分的复合任务,第一协调器704首先根据该复合任务包括的原子任务的类型标识在保存的第一映射关系中查询是否有客户端可以执行此复合任务下所有的子任务,如果有,第一协调器704将该任务发送给该客户端;如果没有,第一协调器704通知第一看守器702任务发送失败。
如果该任务为可拆分的复合任务,第一协调器704将该任务发送到集群中空闲的客户端。
如果该任务的路由属性中将该任务的路由方式限定为跟随策略,第一协调器704首先查询该任务的前置任务被发送到哪一客户端,再检查该客户端是否可以执行当前任务。如果可以,则第一协调器704将该任务发送到该客户端;如果不可以,则第一协调器704通知第一看守器702任务发送失败。
这里,跟随策略与不可拆分的复合任务的区别在于,不可拆分的复合任务中,所有子任务需要捆绑在同一个客户端上;而跟随策略中,只有当前任务和当前任务的前置任务需要捆绑在同一个客户端上。
S711,第二客户端708的第二协调器709接收第i初级子任务。
S712,第二客户端708的第二协调器709创建第i初级子任务对应的第二看守器710,并将第i初级子任务发送到第二看守器710。
S713,第二协调器709为第i初级子任务分配第二资源池。
这里,第二客户端708接收到第i初级子任务后执行的操作与第一客户端701接收到第一任务后执行的操作基本一致。只是,第二客户端708接收到的是符号表和抽象语法树,不需要调用相应的解析器将任务解析为符号表和抽象语法树。
本申请实施例中,客户端之间以抽象语法树的形式来发送任务,使得接收到任务的客户端不需要对任务进行二次解析,提高任务的执行效率。
S714,第二看守器710根据第i初级子任务的类型,将第i初级子任务发送给第二执行器711或第二分解器712。
这里,如果第i初级子任务是原子任务,即表示第二客户端708中存在该原子任务对应的原子任务解释器,因此第一客户端701的第一协调器704才将该原子任务发送到第二客户端708。此时,第二看守器710不能将该原子任务发送到第二协调器709进行二次派发,而应该将其发送给第二执行器711来执行该原子任务。
如果第i初级子任务是复合任务,第二看守器710就将第i初级子任务发送给第二分解器712进行拆分。
S715,第二执行器711执行第i初级子任务,得到执行结果。
这里,发送到第二执行器711的第i初级子任务为原子任务,在第二执行器711处进行执行。如图8所示,第二执行器711接收到符号表和第i初级子任务的抽象语法树之后,递归检查该语法树,首先调用第二通用解释器713将变量引用、常量进行解释。然后调用内置函数解释器714,基于变量引用、常量的解释结果将内置函数进行解释。最后调用原子任务解释器715,基于变量引用、常量的解释结果和内置函数的解释结果将原子任务整体进行解释。这里,内置函数解释器714为原子任务的抽象语法树中包含的内置函数对应的解释器,第二执行器711根据原子任务中包含的内置函数的类型,调用相应的内置函数解释器。原子任务解释器715即为第i初级子任务对应的解释器。
经过这种递归解释,该原子任务即可在原子任务解释器715中被解释为可执行代码可以识别的内容。可执行代码执行原子任务,得到执行结果后,原子任务解释器715将该执行结果转换为抽象语法树,发送给第二执行器711。
S716,第二执行器711通过第二看守器710和第二协调器709将第i初级子任务的执行结果发送给第一协调器704,第一协调器704将第i初级子任务的执行结果转发给第一看守器702。
S717,第二看守器710通知第二协调器709释放第二资源池。
这里,第二执行器711将第i初级子任务执行完毕之后,将执行结果发送给第二看守器710,第二看守器710将执行结果通过第二协调器709发送给第一客户端701的第一协调器704,第二看守器710还通知第二协调器709释放第i初级子任务的第二资源池。经过以上步骤之后,第i初级子任务执行完毕,第一客户端701得到第i初级子任务的执行结果。
S718,第一看守器702将执行结果发送给第i初级子任务对应的第i初级发射器707,并根据第i初级子任务的执行结果更新当前作用域的符号表。
S719,第i初级发射器707根据执行结果和触发信号发送条件,判断是否向外发送触发信号,如果判断结果为是,转到S720;如果判断结果为否,转到S722。
S720,第i初级发射器707向第i+1初级触发器发送触发信号;其中,第i+1初级子任务为第i初级子任务的后置任务。
S721,第i+1初级触发器接收到第i初级发射器707的触发信号,判断是否从触发前状态转换为触发后状态。
这里,如果第i初级子任务具有至少一个后置任务,第i初级发射器根据执行结果与触发信号发送条件进行比较得到的判断结果,决定向哪一个后置任务发送触发信号。如果判断结果表明第i初级发射器需要向第i+1初级子任务发送触发信号,则第i初级发射器707向第i+1初级触发器发送触发信号。
如果第i初级子任务只有第i+1初级子任务这一个后置任务,则第i初级发射器707向第i+1初级触发器发送触发信号。
本申请实施例中,通过设置发射器的触发信号发送条件,在一个任务具有多个后置任务的情况下,可以根据需要指定该任务执行完毕之后,转向哪一个后置任务,提供了用户自定义分支功能,使得集群可以处理流程分支复杂的工作流,提升任务处理能力。
此外,相比于查询数据库来获知任务是否执行完毕的方式,本申请实施例中,当一个任务执行完毕之后,向发射器发送执行结果,从而通过发射器来触发后置任务的触发器,不需要频繁更新和查询数据库,可以减少指令传递和数据操作的次数,提升工作流的处理速度。
此外,第一看守器702还根据第i初级子任务的执行结果更新当前作用域的符号表。这样,第一任务拆分得到的k个初级子任务中,第i初级子任务的后置任务可以通过读取第一资源池中的符号表来引用第i初级子任务的执行结果,提升后置任务的执行效率。
第i+1初级触发器接收到触发信号之后,判断该触发信号是否足以使第i+1初级触发器从触发前状态转换为触发后状态。如果可以,第一看守器702将开始执行第i+1初级子任务,执行第i+1初级子任务的过程与执行第i初级子任务的过程相似;如果不可以,表示第i+1初级触发器是一个“全部”触发器,需要继续等待其他前置任务发送的触发信号。
S722,第i初级发射器707拦截触发信号,通知第一看守器702检查第一任务是否有正在执行中的子任务。
S723,第一看守器702确认第一任务没有正在执行中的子任务,通知第一协调器704释放第一资源池。
这里,如果第i初级发射器707拦截了触发信号,表明第i初级发射器707是一个特殊发射器,第i初级子任务没有后置任务。当第i初级子任务执行完毕之后,第一看守器702检查其对应的第一任务中是否还有其他未执行完毕的子任务,如果没有,则表示第一任务执行完毕,第一看守器702通知第一协调器704释放第一资源池。
S724,第二分解器712接收到第i初级子任务后,将第i初级子任务拆分为次一级的第一次级子任务,……,第j次级子任务,……,第p次级子任务,并将p个次级子任务发送到第二看守器710;其中,j、p为正整数,p≥1。
S725,第二看守器710根据第j次级子任务的入度和出度,创建第j次级子任务对应的第j次级触发器和第j次级发射器。
S726,第j次级触发器被触发后,向第二看守器710发送第j执行信号,第j执行信号用于使第j次级子任务开始执行。
S727,第二看守器710接收到第j次级触发器发送的第j执行信号后,将第j执行信号对应的第j次级子任务发送给第二协调器709。
S728,第二协调器709根据任务发送规则,将符号表和第j次级子任务对应的抽象语法树发送到对应的客户端。
这里,第二看守器710将第i初级子任务发送至第二分解器712,表明第二客户端708接收到的第i初级子任务是一个复合任务。
如果第i初级子任务不是一个可拆分的复合任务,第j次级子任务在第二客户端708中的处理过程与第i初级子任务在第一客户端701中的处理过程基本相同,执行上述与第i初级子任务的处理相关的步骤即可得到第j次级子任务的执行结果。
如果第i初级子任务是一个不可拆分的复合任务,表明第i初级子任务之所以被发送到第二客户端708,是因为第一协调器704确定第二客户端708可以执行第i初级子任务的所有子任务。此时,第二客户端708将第i初级子任务拆分,得到p个次级子任务,并创建每个次级子任务对应的次级触发器和次级发射器之后,每个次级子任务开始执行时,第二协调器709都将该次级子任务发送到第二看守器710,第二看守器710将接收到的次级子任务发送给第二执行器711,在第二客户端708的第二执行器711中执行这些次级子任务,并生成执行结果,实现后置任务的触发,直到第i初级子任务拆分得到的所有次级子任务都在第二客户端内完成执行,生成第i初级子任务的执行结果。
本申请实施例中,在每个客户端中对复合任务执行一次拆分,通过在不同的客户端中迭代进行拆分,将一个由嵌套的原子任务组成复合任务拆分为单个的原子任务,并将原子任务分发到各个客户端中执行,可以实现工作流的分布式处理,简化开发难度。
实施例八
基于前述的实施例,本申请实施例提供一种任务处理装置,该装置所包括的各模块,以及各模块所包括的各单元,都可以通过计算机设备中的处理器来实现;当然也可通过具体的逻辑电路实现;在实施的过程中,处理器可以为中央处理器(CPU)、微处理器(MPU)、数字信号处理器(DSP)或现场可编程门阵列(FPGA)等。
图9为本申请实施例任务处理装置的组成结构示意图,如图9所示,任务处理装置900包括收发模块901,任务拆分模块902,执行结果生成模块903,其中,
收发模块901,用于接收任务发送端发送的第一任务;
任务拆分模块902,用于确定所述第一任务为可拆分的复合任务时,拆分所述第一任务,得到k个初级子任务;其中,k为正整数,k≥1;
收发模块901,还用于向对应的客户端发送所述k个初级子任务;其中,初级子任务对应的客户端由所述初级子任务的类型确定;
收发模块901,还用于接收对应的客户端发送的初级子任务的执行结果;
执行结果生成模块903,用于根据各初级子任务的执行结果,确定所述第一任务的第一执行结果;
收发模块901,还用于向所述任务发送端发送所述第一执行结果。
在一些实施例中,所述收发模块,包括:
发送顺序确定单元,用于根据所述k个初级子任务的后置任务确定所述k个初级子任务的发送顺序;
任务发送单元,用于按照所述发送顺序,向对应的客户端发送所述k个初级子任务。
在一些实施例中,所述任务发送单元,包括:
顺序排列子单元,用于按照所述发送顺序排列所述k个初级子任务;
头部子任务发送子单元,用于当第i初级子任务没有前置任务时,向对应的客户端发送第i初级子任务;其中,i为正整数,1≤i≤k;
非头部子任务发送子单元,用于当第i初级子任务有前置任务时,获取已经生成的所述第i初级子任务的触发信号的个数,得到第一数值;其中,所述触发信号根据所述第i初级子任务的前置任务的执行结果生成;
还用于确定开始处理所述第i初级子任务之前需要生成的所述第i初级子任务的触发信号的个数,得到第二数值;
还用于在确定所述第一数值等于第二数值时,向对应的客户端发送第i初级子任务;
触发信号生成子单元,用于接收到所述第i初级子任务的执行结果后,根据所述执行结果,生成所述第i初级子任务的后置任务的触发信号。
在一些实施例中,所述头部子任务发送子单元或者所述非头部子任务发送子单元向对应的客户端发送第i初级子任务时,具体用于:
如果第i初级子任务有前置任务,判断所述第i初级子任务是否与所述第i初级子任务的前置任务绑定,如果所述第i初级子任务与所述第i初级子任务的前置任务绑定,将接收所述第i初级子任务的前置任务的客户端确定为第一客户端;
如果所述第i初级子任务未与所述第i初级子任务的前置任务绑定或第i初级子任务没有前置任务,判断所述第i初级子任务为原子任务、不可拆分的复合任务还是可拆分的复合任务,得到第一判断结果;
如果所述第一判断结果表明所述第i初级子任务为原子任务,判断所述第i初级子任务是否有指定的执行客户端;
如果有,将所述第i初级子任务指定的执行客户端确定为第一客户端;
如果没有,将具有所述第i初级子任务对应的原子任务解释器的客户端确定为第一客户端;其中,所述第i初级子任务对应的原子任务解释器用于执行所述第i初级子任务;
如果所述第一判断结果表明所述第i初级子任务为不可拆分的复合任务,将具有所述第i初级子任务的全部子任务对应的原子任务解释器的客户端确定为第一客户端;
如果所述第一判断结果表明所述第i初级子任务为可拆分的复合任务,将所述集群中的一个空闲客户端确定为第一客户端;
向所述第一客户端发送所述第i初级子任务。
在一些实施例中,所述装置还包括:
解析需求判断模块,用于在所述收发模块接收任务发送端发送的第一任务后,判断所述第一任务是否需要解析;
任务解析模块,用于确定所述第一任务需要解析时,解析所述第一任务。
在一些实施例中,所述收发模块,还用于:
确定所述第一任务为原子任务时,判断所述第一任务是否有指定的执行客户端;
如果有,将所述第一任务指定的执行客户端确定为第二客户端;
如果没有,将具有所述第一任务对应的原子任务解释器的客户端确定为第二客户端;其中,所述第一任务对应的原子任务解释器用于执行所述第一任务;
所述收发模块,还用于向所述第二客户端发送所述第一任务,并接收所述第二客户端发送的所述第一任务的第一执行结果。
在一些实施例中,所述收发模块,还用于:
确定所述第一任务为不可拆分的复合任务时,向第三客户端发送所述第一任务;其中,所述第三客户端具有所述第一任务的全部子任务对应的原子任务解释器;
接收所述第三客户端发送的所述第一任务的第一执行结果。
在一些实施例中,所述装置还包括:
原子任务执行模块,用于确定所述第一任务不需要解析、且所述第一任务为原子任务时,利用所述第一任务对应的原子任务解释器执行所述第一任务,得到所述第一任务的第一执行结果。
在一些实施例中,所述装置还包括:
不可拆任务拆分模块,用于确定所述第一任务不需要解析、且所述第一任务为不可拆分的复合任务时,拆分所述第一任务,得到至少两个初级子任务;
不可拆任务执行模块,用于利用每个初级子任务对应的原子任务解释器执行所述至少两个初级子任务中的每个初级子任务,得到每个初级子任务的执行结果;
不可拆任务执行结果生成模块,用于根据各初级子任务的执行结果,确定所述第一任务的第一执行结果。
以上装置实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本申请装置实施例中未披露的技术细节,请参照本申请方法实施例的描述而理解。
需要说明的是,本申请实施例中,如果以软件功能模块的形式实现上述的任务处理方法,并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本申请各个实施例所述方法的全部或部分。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read OnlyMemory,ROM)、磁碟或者光盘等各种可以存储程序代码的介质。这样,本申请实施例不限制于任何特定的硬件和软件结合。
对应地,本申请实施例提供一种任务处理装置,包括存储器和处理器,所述存储器存储有可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述实施例中提供的任务处理方法中的步骤。
对应地,本申请实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述实施例中提供的任务处理方法中的步骤。
这里需要指出的是:以上存储介质和设备实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本申请存储介质和设备实施例中未披露的技术细节,请参照本申请方法实施例的描述而理解。
图10为本申请实施例中任务处理装置的一种硬件实体示意图,如图10所示,该任务处理装置1000的硬件实体包括:处理器1001、通信接口1002和存储器1003,其中
处理器1001通常控制任务处理装置1000的总体操作。
通信接口1002可以使任务处理装置1000通过网络与其他设备通信。
存储器1003配置为存储由处理器1001可执行的指令和应用,还可以缓存待处理器1001以及任务处理装置1000中各模块待处理或已经处理的数据,可以通过闪存(FLASH)或随机访问存储器(Random Access Memory,RAM)实现。
应理解,说明书通篇中提到的“一个实施例”或“一实施例”意味着与实施例有关的特定特征、结构或特性包括在本申请的至少一个实施例中。因此,在整个说明书各处出现的“在一个实施例中”或“在一实施例中”未必一定指相同的实施例。此外,这些特定的特征、结构或特性可以任意适合的方式结合在一个或多个实施例中。应理解,在本申请的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
在本申请所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个***,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元;既可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。
另外,在本申请各实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(Read Only Memory,ROM)、磁碟或者光盘等各种可以存储程序代码的介质。
或者,本申请上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备执行本申请各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储设备、ROM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本申请的实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。
Claims (12)
1.一种任务处理方法,其特征在于,所述方法应用于集群中的客户端,所述集群中包括多个能够互相通信的客户端,所述方法包括:
接收任务发送端发送的第一任务;
确定所述第一任务为可拆分的复合任务时,拆分所述第一任务,得到k个初级子任务;其中,k为正整数,k≥1;
向对应的客户端发送所述k个初级子任务;其中,初级子任务对应的客户端由所述初级子任务的类型确定;
接收对应的客户端发送的初级子任务的执行结果;
根据各初级子任务的执行结果,确定所述第一任务的第一执行结果;
向所述任务发送端发送所述第一执行结果。
2.根据权利要求1所述的方法,其特征在于,所述向对应的客户端发送所述k个初级子任务,包括:
根据所述k个初级子任务的后置任务确定所述k个初级子任务的发送顺序;
按照所述发送顺序,向对应的客户端发送所述k个初级子任务。
3.根据权利要求2所述的方法,其特征在于,所述按照所述发送顺序,向对应的客户端发送所述k个初级子任务,包括:
按照所述发送顺序排列所述k个初级子任务;
发送第i初级子任务时,如果第i初级子任务没有前置任务,向对应的客户端发送第i初级子任务;其中,i为正整数,1≤i≤k;
如果第i初级子任务有前置任务,获取已经生成的所述第i初级子任务的触发信号的个数,得到第一数值;其中,所述触发信号根据所述第i初级子任务的前置任务的执行结果生成;
确定开始处理所述第i初级子任务之前需要生成的所述第i初级子任务的触发信号的个数,得到第二数值;
确定所述第一数值等于第二数值时,向对应的客户端发送第i初级子任务;
接收到所述第i初级子任务的执行结果后,根据所述执行结果,生成所述第i初级子任务的后置任务的触发信号。
4.根据权利要求3所述的方法,其特征在于,所述向对应的客户端发送第i初级子任务,包括:
如果第i初级子任务有前置任务,判断所述第i初级子任务是否与所述第i初级子任务的前置任务绑定,如果所述第i初级子任务与所述第i初级子任务的前置任务绑定,将接收所述第i初级子任务的前置任务的客户端确定为第一客户端;
如果所述第i初级子任务未与所述第i初级子任务的前置任务绑定或第i初级子任务没有前置任务,判断所述第i初级子任务为原子任务、不可拆分的复合任务还是可拆分的复合任务,得到第一判断结果;
如果所述第一判断结果表明所述第i初级子任务为原子任务,判断所述第i初级子任务是否有指定的执行客户端;
如果有,将所述第i初级子任务指定的执行客户端确定为第一客户端;
如果没有,将具有所述第i初级子任务对应的原子任务解释器的客户端确定为第一客户端;其中,所述第i初级子任务对应的原子任务解释器用于执行所述第i初级子任务;
如果所述第一判断结果表明所述第i初级子任务为不可拆分的复合任务,将具有所述第i初级子任务的全部子任务对应的原子任务解释器的客户端确定为第一客户端;
如果所述第一判断结果表明所述第i初级子任务为可拆分的复合任务,将所述集群中的一个空闲客户端确定为第一客户端;
向所述第一客户端发送所述第i初级子任务。
5.根据权利要求1至4任一项所述的方法,其特征在于,接收任务发送端发送的第一任务之后,所述方法还包括:
判断所述第一任务是否需要解析;
确定所述第一任务需要解析时,解析所述第一任务。
6.根据权利要求5所述的方法,其特征在于,还包括:
确定所述第一任务为原子任务时,判断所述第一任务是否有指定的执行客户端;
如果有,将所述第一任务指定的执行客户端确定为第二客户端;
如果没有,将具有所述第一任务对应的原子任务解释器的客户端确定为第二客户端;其中,所述第一任务对应的原子任务解释器用于执行所述第一任务;
向所述第二客户端发送所述第一任务;
接收所述第二客户端发送的所述第一任务的第一执行结果;
向所述任务发送端发送所述第一执行结果。
7.根据权利要求5所述的方法,其特征在于,还包括:
确定所述第一任务为不可拆分的复合任务时,向第三客户端发送所述第一任务;其中,所述第三客户端具有所述第一任务的全部子任务对应的原子任务解释器;
接收所述第三客户端发送的所述第一任务的第一执行结果;
向所述任务发送端发送所述第一执行结果。
8.根据权利要求5所述的方法,其特征在于,还包括:
确定所述第一任务不需要解析、且所述第一任务为原子任务时,利用所述第一任务对应的原子任务解释器执行所述第一任务,得到所述第一任务的第一执行结果;
向所述任务发送端发送所述第一执行结果。
9.根据权利要求5所述的方法,其特征在于,还包括:
确定所述第一任务不需要解析、且所述第一任务为不可拆分的复合任务时,拆分所述第一任务,得到至少两个初级子任务;
利用每个初级子任务对应的原子任务解释器执行所述至少两个初级子任务中的每个初级子任务,得到每个初级子任务的执行结果;
根据各初级子任务的执行结果,确定所述第一任务的第一执行结果;
向所述任务发送端发送所述第一执行结果。
10.一种任务处理装置,其特征在于,所述装置为集群中的客户端,所述集群中包括若干个可以互相通信的客户端,所述装置包括:
收发模块,用于接收任务发送端发送的第一任务;
任务拆分模块,用于确定所述第一任务为可拆分的复合任务时,拆分所述第一任务,得到k个初级子任务;其中,k为正整数,k≥1;
所述收发模块,还用于向对应的客户端发送所述k个初级子任务;其中,初级子任务对应的客户端由所述初级子任务的类型确定;
所述收发模块,还用于接收对应的客户端发送的初级子任务的执行结果;
执行结果生成模块,用于根据各初级子任务的执行结果,确定所述第一任务的第一执行结果;
所述收发模块,还用于向所述任务发送端发送所述第一执行结果。
11.一种任务处理装置,其特征在于,所述装置包括:存储器、处理器,所述存储器存储有可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述权利要求1至9任一项所述的任务处理方法。
12.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机可执行指令,该计算机可执行指令配置为执行上述权利要求1至9任一项所述的任务处理方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910887217.1A CN112527471B (zh) | 2019-09-19 | 2019-09-19 | 任务处理方法及其装置、存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910887217.1A CN112527471B (zh) | 2019-09-19 | 2019-09-19 | 任务处理方法及其装置、存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112527471A true CN112527471A (zh) | 2021-03-19 |
CN112527471B CN112527471B (zh) | 2023-04-07 |
Family
ID=74974205
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910887217.1A Active CN112527471B (zh) | 2019-09-19 | 2019-09-19 | 任务处理方法及其装置、存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112527471B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113254506A (zh) * | 2021-06-18 | 2021-08-13 | 浙江口碑网络技术有限公司 | 数据处理方法、装置、计算机设备及存储介质 |
CN113805976A (zh) * | 2021-09-16 | 2021-12-17 | 上海商汤科技开发有限公司 | 数据处理方法及装置、电子设备及计算机可读存储介质 |
CN115392063A (zh) * | 2022-10-31 | 2022-11-25 | 西安羚控电子科技有限公司 | 一种多速率仿真方法及*** |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040148605A1 (en) * | 2003-01-28 | 2004-07-29 | Samsung Electronics Co., Ltd. | Distributed processing system and method using virtual machine |
CN102508704A (zh) * | 2011-11-10 | 2012-06-20 | 上海市共进通信技术有限公司 | 计算机软件***中实现任务分解和并行处理控制的方法 |
CN108566408A (zh) * | 2018-01-18 | 2018-09-21 | 咪咕文化科技有限公司 | 一种业务处理方法、装置及存储介质 |
CN110113387A (zh) * | 2019-04-17 | 2019-08-09 | 深圳前海微众银行股份有限公司 | 一种基于分布式批量处理***的处理方法、装置及*** |
-
2019
- 2019-09-19 CN CN201910887217.1A patent/CN112527471B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040148605A1 (en) * | 2003-01-28 | 2004-07-29 | Samsung Electronics Co., Ltd. | Distributed processing system and method using virtual machine |
CN102508704A (zh) * | 2011-11-10 | 2012-06-20 | 上海市共进通信技术有限公司 | 计算机软件***中实现任务分解和并行处理控制的方法 |
CN108566408A (zh) * | 2018-01-18 | 2018-09-21 | 咪咕文化科技有限公司 | 一种业务处理方法、装置及存储介质 |
CN110113387A (zh) * | 2019-04-17 | 2019-08-09 | 深圳前海微众银行股份有限公司 | 一种基于分布式批量处理***的处理方法、装置及*** |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113254506A (zh) * | 2021-06-18 | 2021-08-13 | 浙江口碑网络技术有限公司 | 数据处理方法、装置、计算机设备及存储介质 |
CN113805976A (zh) * | 2021-09-16 | 2021-12-17 | 上海商汤科技开发有限公司 | 数据处理方法及装置、电子设备及计算机可读存储介质 |
CN115392063A (zh) * | 2022-10-31 | 2022-11-25 | 西安羚控电子科技有限公司 | 一种多速率仿真方法及*** |
CN115392063B (zh) * | 2022-10-31 | 2023-01-31 | 西安羚控电子科技有限公司 | 一种多速率仿真方法及*** |
Also Published As
Publication number | Publication date |
---|---|
CN112527471B (zh) | 2023-04-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109889575B (zh) | 一种边缘环境下的协同计算平台***及方法 | |
CN112527471B (zh) | 任务处理方法及其装置、存储介质 | |
US11016673B2 (en) | Optimizing serverless computing using a distributed computing framework | |
US20190377604A1 (en) | Scalable function as a service platform | |
CN109240758B (zh) | 一种支持插件接口同步异步统一调用的方法及微内核*** | |
CN108696381B (zh) | 一种协议配置方法及装置 | |
CN110333941B (zh) | 一种基于sql的大数据实时计算方法 | |
WO2021238796A1 (zh) | 下载任务异步处理方法、装置、***和存储介质 | |
US10089084B2 (en) | System and method for reusing JavaScript code available in a SOA middleware environment from a process defined by a process execution language | |
CN112313627B (zh) | 事件到无服务器函数工作流实例的映射机制 | |
CN100462956C (zh) | 用于在计算***上加载程序的方法和*** | |
US9996344B2 (en) | Customized runtime environment | |
US10223143B2 (en) | System and method for supporting javascript as an expression language in a process defined by a process execution language for execution in a SOA middleware environment | |
CN110891083B (zh) | 一种Gaia中支持多作业并行执行的代理方法 | |
US10268496B2 (en) | System and method for supporting object notation variables in a process defined by a process execution language for execution in a SOA middleware environment | |
CN116932147A (zh) | 流式作业处理方法、装置、电子设备及介质 | |
KR102441167B1 (ko) | 펑션 실행 장치 및 방법 | |
CN116775041A (zh) | 基于流计算框架和rete算法的大数据实时决策引擎 | |
US9537931B2 (en) | Dynamic object oriented remote instantiation | |
EP3495960A1 (en) | Program, apparatus, and method for communicating data between parallel processor cores | |
Campos et al. | The chance for Ada to support distribution and real-time in embedded systems | |
CN114461249A (zh) | 一种微服务部署方法、装置、代码服务器及存储介质 | |
WO2020098610A1 (zh) | 一种业务调度方法、设备和存储介质 | |
US10223142B2 (en) | System and method for supporting javascript activities in a process defined by a process execution language for execution in a SOA middleware environment | |
CN117130622B (zh) | 一种分布式在线代码编译运行方法及*** |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |