不同语言代码间的接口调用方法、装置、介质与计算设备转让专利

申请号 : CN202111493523.0

文献号 : CN113934407B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 黄兴勃

申请人 : 阿里云计算有限公司

摘要 :

本说明书披露的多个实施例提供了一种不同语言代码间的接口调用方法、装置、介质与计算设备。数据处理进程在基于第一语言代码执行数据处理过程中,如果需要实现某个扩展功能的计算,而该计算需要基于第二语言代码来执行,那么可以利用不同语言代码之间的标准交互接口,实现对第二语言代码的调用。

权利要求 :

1.一种不同语言代码间的接口调用方法,应用于运行在第一语言运行环境的数据处理进程,在基于第一语言代码执行数据处理过程中,若确定需要基于预设的第二语言代码执行目标计算,则执行所述方法,第一语言包括JAVA,第二语言包括Python,所述方法包括:基于第一语言代码,将相应的第一语言对象格式的计算参数转换成C对象格式的计算参数,并且以C对象格式的计算参数为接口输入,调用第一接口;第一接口是第一语言与C语言之间的标准交互接口;

基于预设的C语言代码,将C对象格式的计算参数转换成第二语言对象格式的计算参数,并且以第二语言对象格式的计算参数为接口输入,调用第二接口;第二接口是第二语言与C语言之间的标准交互接口;

基于第二语言代码,根据第二语言对象格式的计算参数执行目标计算,得到计算结果,将第二语言对象格式的计算结果转换成C对象格式的计算结果,并且以C对象格式的计算结果为接口输入,调用第二接口;

基于C语言代码,将C对象格式的计算结果转换成第一语言对象格式的计算结果,并且以第一语言对象格式的计算结果为接口输入,调用第一接口。

2.如权利要求1所述方法,在基于第一语言代码以C对象格式的计算参数为接口输入调用第一接口之前,还包括:基于第一语言代码,以第二语言代码中用于执行目标计算的目标函数的函数标识为接口输入调用第一接口;

基于C语言代码以第二语言对象格式的计算参数为接口输入调用第二接口之前,还包括:基于C语言代码,以目标函数的函数标识为接口输入调用第二接口;

基于第二语言代码,根据第二语言对象格式的计算参数执行目标计算,包括:基于第二语言代码,根据第二语言对象格式的计算参数执行目标函数。

3.如权利要求1所述方法,基于第二语言代码,根据第二语言对象格式的计算参数执行目标计算,包括:基于第二语言代码,在根据第二语言对象格式的计算参数执行目标计算的过程中,若确定需要基于第一语言代码执行其他计算,则将相应的第二语言对象格式的其他计算参数转换成C对象格式的其他计算参数,并且以C对象格式的其他计算参数为接口输入,调用第二接口;

基于C语言代码,将C对象格式的其他计算参数转换成第一语言对象格式的其他计算参数,并且以第一语言对象格式的其他计算参数为接口输入,调用第一接口;

基于第一语言代码,根据第一语言对象格式的其他计算参数执行其他计算,得到其他计算结果,将第一语言对象格式的其他计算结果转换成C对象格式的其他结算结果,并且以C对象格式的其他计算结果为接口输入,调用第一接口;

基于C语言代码,将C对象格式的其他计算结果转换成第二语言对象格式的其他计算结果,并且以第二语言对象格式的其他计算结果为接口输入,调用第二接口。

4.如权利要求3所述方法,在基于第二语言代码以C对象格式的其他计算参数为接口输入调用第二接口之前,还包括:基于第二语言代码,以第一语言代码中用于实现其他计算的其他函数的函数标识为接口输入调用第一接口;

基于C语言代码以第一语言对象格式的其他计算参数为接口输入调用第一接口之前,还包括:基于C语言代码,以所述其他函数的函数标识为接口输入调用第一接口;

基于第一语言代码,根据第一语言对象格式的其他计算参数执行其他计算,包括:基于第一语言代码,根据第一语言对象格式的其他计算参数执行其他函数。

5.如权利要求1所述方法,所述数据处理进程通过创建的第一类线程执行所述方法,所述数据处理进程还创建了用于辅助第一类线程的第二类线程;

在第一类线程执行所述方法之前,第二类线程执行以下初始化步骤:基于第一语言代码,以初始化第二语言代码的运行环境的请求为接口输入,调用第一接口;

基于C语言代码,以初始化第二语言代码的运行环境的请求为接口输入,调用第二接口;

基于第二语言代码,响应于初始化第二语言代码的运行环境的请求,初始化第二语言代码的运行环境。

6.如权利要求5所述方法,所述第二类线程执行的初始化步骤还包括:基于C语言代码,以启动多线程功能的请求为接口输入,调用第二接口;所述多线程功能为支持多个第一类线程分别实现基于第二语言代码执行的不同计算的功能;

基于第二语言代码,响应于启动多线程功能的请求,初始化多线程功能。

7.如权利要求5所述方法,所述第二类线程执行的初始化步骤还包括:基于C语言代码,以创建第二语言解释器的请求为接口输入,调用第二接口;

基于第二语言代码,响应于创建第二语言解释器的请求,在第二语言代码的运行环境中创建第二语言解释器。

8.如权利要求6所述方法,所述第二类线程执行的初始化步骤还包括:基于C语言代码,以加载多个第一类线程可共享的第二语言代码中一个或多个代码模块的请求为接口输入,调用第二接口;

基于第二语言代码,响应于加载第二语言代码中一个或多个代码模块的请求,在第二语言代码的运行环境中加载相应的代码模块。

9.如权利要求5所述方法,在第一类线程执行所述方法之前,所述第一类线程还执行以下初始化步骤:基于第一语言代码,以初始化所述第一类线程对应的子运行环境的请求为接口输入,调用第二接口;

基于C语言代码,以初始化所述第一类线程对应的子运行环境的请求为接口输入,调用第二接口;

基于第二语言代码,响应于初始化所述第一类线程对应的子运行环境的请求,第二语言代码的运行环境中初始化所述第一类线程对应的子运行环境。

10.如权利要求9所述方法,所述第一类线程执行的初始化步骤还包括:基于C语言代码,以创建第二语言子解释器的请求为接口输入,调用第二接口;

基于第二语言代码,响应于创建第二语言子解释器的请求,根据第二语言解释器在所述第一类线程对应的子运行环境中创建子解释器。

11.如权利要求9所述方法,所述第一类线程执行的初始化步骤还包括:基于C语言代码,以加载第二语言代码中的主代码模块的请求为接口输入,调用第二接口;

基于第二语言代码,响应于加载第二语言代码中的主代码模块的请求,在所述第一类线程对应的子运行环境中,加载第二语言代码中的主代码模块。

12.如权利要求11所述方法,所述第一类线程执行的初始化步骤还包括:基于C语言代码,以获取主代码模块的属性表的请求为接口输入,调用第二接口;

基于第二语言代码,响应于获取主代码模块的属性表的请求,获取主代码模块的属性表;

基于C语言代码,将主代码模块的属性添加到目标计算的计算参数中。

13.一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现权利要求1至12任一项所述方法。

14.一种计算设备,包括存储器、处理器;所述存储器用于存储可在处理器上运行的计算机指令,所述处理器用于在执行所述计算机指令时实现权利要求1至12任一项所述方法。

说明书 :

不同语言代码间的接口调用方法、装置、介质与计算设备

技术领域

[0001] 本说明书多个实施例涉及数据库技术领域,尤其涉及一种不同语言代码间的接口调用方法、装置、介质与计算设备。

背景技术

[0002] 目前的数据流处理系统所创建的数据处理进程通常运行在特定语言的运行环境中,也就是说,数据处理进程通常仅能够直接执行基于该特定语言编写的代码。而在有些情况下,可能会基于其他语言编写一些用于实现扩展功能的代码并配置给数据处理进程,期望数据处理进程可以实现该扩展功能。
[0003] 因此,如何使得数据处理进程能够实现该扩展功能,成为亟待解决的技术问题。

发明内容

[0004] 本说明书的多个实施例提供一种执行数据处理任务的方法、装置、介质与计算设备,以便使得数据处理进程在基于第一语言编写的代码执行数据处理任务过程中能够调用第二语言编写的代码来实现扩展功能。
[0005] 本说明书多个实施例提供技术方案如下:
[0006] 根据本说明书多个实施例的第一方面,提出了一种不同语言代码间的接口调用方法,应用于运行在第一虚拟机上的数据处理进程,在基于第一语言代码执行数据处理过程中,若确定需要基于预设的第二语言代码执行目标计算,则执行所述方法,所述方法包括:
[0007] 基于第一语言代码,将相应的第一语言对象格式的计算参数转换成C对象格式的计算参数,并且以C对象格式的计算参数为接口输入,调用第一接口;第一接口是第一语言与C语言之间的标准交互接口;
[0008] 基于预设的C语言代码,将C对象格式的计算参数转换成第二语言对象格式的计算参数,并且以第二语言对象格式的计算参数为接口输入,调用第二接口;第二接口是第二语言与C语言之间的标准交互接口;
[0009] 基于第二语言代码,根据第二语言对象格式的计算参数执行目标计算,得到计算结果,将第二语言对象格式的计算结果转换成C对象格式的计算结果,并且以C对象格式的计算结果为接口输入,调用第二接口;
[0010] 基于C语言代码,将C对象格式的计算结果转换成第一语言对象格式的计算结果,并且以第一语言对象格式的计算结果为接口输入,调用第一接口。
[0011] 根据本说明书多个实施例的第二方面,提出了一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现第一方面的方法。
[0012] 根据本说明书多个实施例的第三方面,提出了一种计算设备,包括存储器、处理器;所述存储器用于存储可在处理器上运行的计算机指令,所述处理器用于在执行所述计算机指令时实现第一方面的方法。
[0013] 在上述技术方案中,数据处理进程在基于第一语言代码执行数据处理过程中,如果需要实现某个扩展功能的计算,而该计算需要基于第二语言代码来执行,那么可以执行以下调用流程:
[0014] 1、基于第一语言代码,将计算所需要的计算参数的对象格式转换成C语言所支持的对象格式(即C对象格式),携带C对象格式的计算参数调用第一语言与C语言之间的标准交互接口。
[0015] 2、基于C语言代码,将C对象格式的计算参数进一步转换成第二语言对象格式的计算参数,并携带第二语言对象格式的计算参数调用C语言与第二语言之间的标准交互接口。
[0016] 3、基于第二语言代码,根据第二语言对象格式的计算参数执行目标计算,得到计算结果,并且将计算结果转换成C对象格式,携带C对象格式的计算结果调用C语言与第二语言之间的标准交互接口。
[0017] 4、基于C语言代码,将C对象格式的计算结果转换成第一语言对象格式的计算结果,并携带第一语言对象格式的计算结果调用C语言与第二语言之间的标准交互接口。
[0018] 通过上述技术方案,可以实现数据处理进程在基于第一语言代码执行数据处理过程中,实现依赖于第二语言代码的扩展功能。

附图说明

[0019] 图1是本说明书提供的一种不同语言代码间的接口调用方法的流程示意图。
[0020] 图2示例性提供了第一语言代码、C语言代码、第二语言代码之间的接口连接关系。
[0021] 图3示例性提供一种第二类线程初始化第二语言代码的运行环境的流程。
[0022] 图4示例性提供一种第一类线程初始化第二语言代码的子运行环境的流程。
[0023] 图5示例性提供一种第一类线程执行接口调用方法的流程。

具体实施方式

[0024] 为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本说明书保护的范围。
[0025] 需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。
[0026] 数据流处理系统,又称数据流处理框架、数据流处理引擎,其是基于第一语言开发的软件系统,该软件系统由流式分布的若干计算节点组成,用户将自己的数据提交给数据流处理系统,数据可以在这些计算节点间流动,这些计算节点通过协作完成数据处理任务。常见的数据流处理系统例如可以是Flink。
[0027] 数据流系统在需要进行数据处理时,通常会在每个计算节点上创建数据处理进程,由每个计算节点上的数据处理进程实际执行数据处理。目前的数据流处理系统所创建的数据处理进程通常运行在第一虚拟机上,第一虚拟机一般仅支持直接运行基于第一语言编写的代码。而在有些情况下,存在以下这种需求,即可能会基于第二语言编写一些用于实现扩展功能的代码并配置给数据处理进程,期望数据处理进程可以实现该扩展功能。
[0028] 此处示例性给出上述需求产生的一种原因。数据流系统可以支持用户自定义扩展功能,用户可以请求在一或多个计算节点上部署自定义的扩展功能,相应的计算节点上的数据处理进程可以在进行数据处理过程中针对数据实现相应的扩展功能。例如,用户可以自定义函数,并将函数配置给某个计算节点。在实践中,用户可能不具有利用第一语言编写用于实现扩展功能的代码的能力,而是可能仅仅有利用第二这样简单的语言编写用于实现扩展功能的代码的能力,这就产生了上述需求。
[0029] 因此,如何使得数据处理进程能够实现该扩展功能,成为亟待解决的技术问题。
[0030] 一种可选的解决上述技术问题的技术方案为,计算节点上的数据处理进程在需要实现依赖于第二语言代码的扩展功能时,可以拉起另一个辅助处理进程,该辅助处理进程可以不运行在第一虚拟机中,而是运行在第二运行环境中,如此一来,数据处理进程与辅助处理进程之间,可以利用进程间通信的技术机制进行数据交互,也就是说,数据处理进程将需要实现的计算的计算参数发送给辅助处理进程,辅助处理进程执行计算之后,将计算结果返回给数据处理进程。
[0031] 此外,为了避免进程间通信给计算节点带来较大的性能开销,本说明书提供了另一种解决上述技术问题的技术方案。数据处理进程在基于第一语言代码执行数据处理过程中,如果需要实现某个扩展功能的计算,而该计算需要基于第二语言代码来执行,那么可以执行以下调用流程:
[0032] 1、基于第一语言代码,将计算所需要的计算参数的对象格式转换成C语言所支持的对象格式(即C对象格式),携带C对象格式的计算参数调用第一语言与C语言之间的标准交互接口。
[0033] 2、基于C语言代码,将C对象格式的计算参数进一步转换成第二语言对象格式的计算参数,并携带第二语言对象格式的计算参数调用C语言与第二语言之间的标准交互接口。
[0034] 3、基于第二语言代码,根据第二语言对象格式的计算参数执行目标计算,得到计算结果,并且将计算结果转换成C对象格式,携带C对象格式的计算结果调用C语言与第二语言之间的标准交互接口。
[0035] 4、基于C语言代码,将C对象格式的计算结果转换成第一语言对象格式的计算结果,并携带第一语言对象格式的计算结果调用C语言与第二语言之间的标准交互接口。
[0036] 上述的第一语言与第二语言通常可以是指C语言之外的任何高级编程语言,并且,第一语言与第二语言是不同的编程语言。C语言之外的高级语言例如可以是JAVA、Python、Go、PHP、Ruby等等。
[0037] 本方案的技术原理在于,几乎所有除C语言之外的高级编程语言在语法上都支持与C语言之间进行交互。在第一虚拟机中运行第一语言代码的过程中,如果涉及调用与C语言代码之间的接口的操作,依然属于执行第一语言代码的过程,相当于在第一语言代码中向内嵌套一层C语言代码。而在通过与C语言代码之间的接口运行C语言代码的过程中,如果涉及进一步调用与第二语言代码之间的接口的操作依然属于执行C语言代码的过程,相当于在C语言代码中向内嵌套一层第二语言代码。又因为通过接口调用来运行C语言代码的操作属于执行第一语言代码的过程,所以,本质上运行第二语言代码的操作属于执行第一语言代码的过程,相当于在第一语言代码中向内先嵌套一层C语言代码,然后进一步在C语言代码中向内嵌套一层第二语言代码。因此,这就可以使得第一语言代码、C语言代码、第二语言代码都可以运行在第一虚拟机上创建的同一数据处理进程中。
[0038] 基于类似的原理,在运行第二语言代码过程中,也可以通过调用与C语言代码之间的接口,再运行C语言代码中“有关调用C语言代码与第一语言代码之间的接口”的代码模块,从而实现在运行第二语言代码的过程中实现依赖于第一语言代码的计算。
[0039] 通过上述技术方案,可以实现数据处理进程在基于第一语言代码执行数据处理过程中,实现依赖于第二语言代码的扩展功能,同时,可以在同一进程内(数据处理进程)实现第一语言代码、第二语言代码以及C语言代码,不会涉及进程间通信,也就不会给计算节点带来很大的性能开销。
[0040] 以下结合附图,详细说明本说明书提供的技术方案。
[0041] 图1是本说明书提供的一种不同语言代码间的接口调用方法的流程示意图,包括如下步骤:
[0042] S100:基于第一语言代码,将相应的第一语言对象格式的计算参数转换成C对象格式的计算参数,并且以C对象格式的计算参数为接口输入,调用第一接口。
[0043] S102:基于预设的C语言代码,将C对象格式的计算参数转换成第二语言对象格式的计算参数,并且以第二语言对象格式的计算参数为接口输入,调用第二接口。
[0044] S104:基于第二语言代码,根据第二语言对象格式的计算参数执行目标计算,得到计算结果,将第二语言对象格式的计算结果转换成C对象格式的计算结果,并且以C对象格式的计算结果为接口输入,调用第二接口。
[0045] S106:基于C语言代码,将C对象格式的计算结果转换成第一语言对象格式的计算结果,并且以第一语言对象格式的计算结果为接口输入,调用第一接口。
[0046] 图1所示方法流程可以应用于数据处理进程,数据处理进程通常运行于计算节点的第一虚拟机中。数据处理进程在基于第一语言代码执行数据处理过程中,若确定需要基于预设的第二语言代码执行目标计算,则可以执行图1所示方法流程。
[0047] 第二语言代码是用于实现扩展功能的代码,其可以是用户编写并配置给计算节点的。在一些实施例中,第二语言代码可以包括若干函数,这些函数可以用于实现扩展功能对应的计算能力。
[0048] 本文为了描述的方便,将第二语言代码用于实现的扩展功能所对应的计算称为目标计算,将目标计算所需要的输入称为计算参数,将目标计算的输出称为计算结果。
[0049] 需要说明的是,计算节点上部署的第一语言代码通常包括若干代码模块,其中一些常规代码模块用于实现数据处理过程中出现的不依赖于第二语言代码的功能,而另一些涉及接口调用方案的代码模块用于实现步骤S100,以及后文中更具体实施例中基于第一语言代码实现的其他步骤。在本文中不对第一语言代码中的进行说明,而是聚焦于第一语言代码中涉及接口调用方案的代码模块。
[0050] 还需要说明的是,第二语言代码也通常包括若干代码模块,其中一些代码模块用于实现扩展功能(如用户的自定义函数),另一些代码模块用于提供一些属性信息(如变量、常量),另外,还有一些代码模块用于实现与接口调用方案有关的功能,如调用与C语言代码之间的标准交互接口。
[0051] 此外,C语言代码的作用可以理解为第一语言代码与第二语言代码之间的桥梁。图2示例性提供了第一语言代码、C语言代码、第二语言代码之间的接口连接关系,在图2提供的示例中,第一语言是JAVA,第二语言是Python。
[0052] 值得强调的是,本文中所谓的“基于XX代码,执行YY”,是指数据处理进程执行YY所需要的能力是XX代码提供的。
[0053] 本文为了描述的方便,将第一语法中定义的与C语言进行交互的标准交互接口称为第一接口,将第二语法中定义的与C语言进行交互的标准交互接口称为第二接口。
[0054] 还需要说明的是,不同的语言代码通常要求不同的对象格式。数据处理进程基于第一语言代码进行数据处理过程中获取的目标计算的计算参数,通常是第一语言对象格式的,而第二语言代码进行计算时所需要的输入需要是第二语言对象格式的。考虑到需要以C语言代码分别与第一语言代码、第二语言代码之间的接口为桥梁,计算参数还需要经过C语言代码进行传递,因此,数据处理进程在基于第一语言代码调用第一接口时,实际上是与C语言代码进行交互,因此需要先将第一语言对象格式的计算参数暂时性地转换成C语言对象格式的计算参数,之后,才能再基于C语言代码调用第二接口。又因为基于C语言代码调用第二接口实际上与第二语言代码进行交互,因此需要再将C对象格式的计算参数转换成第二语言对象格式的计算参数,之后才能调用第二接口,才能基于第二语言代码对第二语言对象格式的计算参数进行计算。
[0055] 基于第二语言代码执行目标计算之后,还需要再经过连续两次格式转换将计算结果再反馈给数据处理进程基于第一语言代码所执行的处理环节。此处原理与计算参数的格式转换类似,不再赘述。
[0056] 在一些实施例中,在基于第一语言代码以C对象格式的计算参数为接口输入调用第一接口之前,还可以基于第一语言代码,以第二语言代码中用于执行目标计算的目标函数的函数标识为接口输入调用第一接口。如此,在基于C语言代码以第二语言对象格式的计算参数为接口输入调用第二接口之前,还可以基于C语言代码,以目标函数的函数标识为接口输入调用第二接口。这样的话,可以基于第二语言代码,根据第二语言对象格式的计算参数执行目标函数。
[0057] 在一些实施例中,基于第二语言代码执行目标计算过程中,可能又会涉及其他计算,该其他计算有可能需要从基于第一语言代码推进的数据处理流程的其他计算环节获取其他计算参数。因此,可以基于第二语言代码,在根据第二语言对象格式的计算参数执行目标计算的过程中,若确定需要基于第一语言代码执行其他计算,则将相应的第二语言对象格式的其他计算参数转换成C对象格式的其他计算参数,并且以C对象格式的其他计算参数为接口输入,调用第二接口。接着,可以基于C语言代码,将C对象格式的其他计算参数转换成第一语言对象格式的其他计算参数,并且以第一语言对象格式的其他计算参数为接口输入,调用第一接口。接着,可以基于第一语言代码,根据第一语言对象格式的其他计算参数执行其他计算,得到其他计算结果,将第一语言对象格式的其他计算结果转换成C对象格式的其他结算结果,并且以C对象格式的其他计算结果为接口输入,调用第一接口。然后,可以基于C语言代码,将C对象格式的其他计算结果转换成第二语言对象格式的其他计算结果,并且以第二语言对象格式的其他计算结果为接口输入,调用第二接口。
[0058] 相应的,在基于第二语言代码以C对象格式的其他计算参数为接口输入调用第二接口之前,可以基于第二语言代码,以第一语言代码中用于实现其他计算的其他函数的函数标识为接口输入调用第一接口。如此,可以在基于C语言代码以第一语言对象格式的其他计算参数为接口输入调用第一接口之前,基于C语言代码,以所述其他函数的函数标识为接口输入调用第一接口。这样的话,可以基于第一语言代码,根据第一语言对象格式的其他计算参数执行其他函数。
[0059] 在一些实施例中,数据处理进程如果确定某个计算环节需要依赖于第二语言代码来实现,那么可以中断当前对于数据处理流程的推进状态,转而执行图1所示方法。
[0060] 在另一些实施例中,数据处理进程可以进一步创建若干线程,让不同线程具体负责不同任务。具体而言,数据处理进程可以创建主线程,主线程负责基于第一语言代码推进数据处理流程,此外,数据处理进程可以创建若干第一类线程。其中,每个第一类线程可以针对一个依赖于第二语言实现的计算,执行图1所示方法流程。
[0061] 进一步地,考虑到每个第一类线程在执行图1所示方法流程时需要第二语言代码的运行环境,一般的思路是一个第一类线程来初始化第二语言代码的运行环境,其他第一类线程可以复用该运行环境。但是,如果由某个第一类线程来初始化第二语言代码的运行环境的话,可能会造成多个第一类线程之间的争抢问题(例如,争抢第二语言解释器的锁),并且,初始化第二语言代码的运行环境的那个第一类线程执行结束之后,相应的运行环境也会关闭,容易导致其他正在使用该运行环境的第一类线程执行失败。
[0062] 因此,数据处理进程还可以创建用于辅助第一类线程的第二类线程。第二类线程可以是守护线程,可以理解为对各个当前正在执行的第一类线程进行守护,只有存在正在执行的至少一个第一类线程,第二类线程就不会回收。需要说明的是,即便数据处理进程只会允许一个第一类线程执行,也同样可以创建第二类线程。
[0063] 在第一类线程执行所述方法之前,第二类线程可以执行以下初始化步骤:
[0064] 基于第一语言代码,以初始化第二语言代码的运行环境的请求为接口输入,调用第一接口;基于C语言代码,以初始化第二语言代码的运行环境的请求为接口输入,调用第二接口;基于第二语言代码,响应于初始化第二语言代码的运行环境的请求,初始化第二语言代码的运行环境。第二类线程初始化第二语言代码的运行环境的步骤也涉及了不同语言间的接口调用。
[0065] 进一步地,第二类线程执行的初始化步骤还可以包括:基于C语言代码,以启动多线程功能的请求为接口输入,调用第二接口;所述多线程功能为支持多个第一类线程分别实现基于第二语言代码执行的不同计算的功能;基于第二语言代码,响应于启动多线程功能的请求,初始化多线程功能。此外,还可以基于C语言代码,以加载多个第一类线程可共享的第二语言代码中一个或多个代码模块的请求为接口输入,调用第二接口;基于第二语言代码,响应于加载第二语言代码中一个或多个代码模块的请求,在第二语言代码的运行环境中加载相应的代码模块。
[0066] 进一步地,第二类线程执行的初始化步骤还可以包括:基于C语言代码,以创建第二语言解释器的请求为接口输入,调用第二接口;基于第二语言代码,响应于创建第二语言解释器的请求,在第二语言代码的运行环境中创建第二语言解释器。
[0067] 此外,在一些实施例中,多个第一类线程都可以复用第二类线程创建的第二语言解释器,然而,为了避免这多个第一类线程运行环境中的资源进行争抢,因此,第一类线程在执行图1所示方法流程之前,还可以执行以下初始化步骤:
[0068] 基于第一语言代码,以初始化所述第一类线程对应的子运行环境的请求为接口输入,调用第二接口;基于C语言代码,以初始化所述第一类线程对应的子运行环境的请求为接口输入,调用第二接口;基于第二语言代码,响应于初始化所述第一类线程对应的子运行环境的请求,第二语言代码的运行环境中初始化所述第一类线程对应的子运行环境。
[0069] 进一步地,第一类线程执行的初始化步骤还可以包括:基于C语言代码,以创建第二语言子解释器的请求为接口输入,调用第二接口;基于第二语言代码,响应于创建第二语言子解释器的请求,根据第二语言解释器在所述第一类线程对应的子运行环境中创建子解释器。如此,每个第一类线程可以有专用的子解释器,避免了对第二线程创建的解释器的线程锁的争抢。同时,不同第一类线程也有了独立的变量命名空间。
[0070] 进一步地,第一类线程执行的初始化步骤还可以包括:基于C语言代码,以加载第二语言代码中的主代码模块的请求为接口输入,调用第二接口;基于第二语言代码,响应于加载第二语言代码中的主代码模块的请求,在所述第一类线程对应的子运行环境中,加载第二语言代码中的主代码模块。
[0071] 进一步地,第一类线程执行的初始化步骤还可以包括:基于C语言代码,以获取主代码模块的属性表的请求为接口输入,调用第二接口;基于第二语言代码,响应于获取主代码模块的属性表的请求,获取主代码模块的属性表;基于C语言代码,将主代码模块的属性添加到目标计算的计算参数中。
[0072] 此外, 第二语言解释器或者子解释器通常具有线程锁,因此,不论是在第一类线程执行的初始化步骤中,还是在图1所示的方法流程中,都涉及获取线程锁与释放线程锁的操作,对于这些操作,同样涉及不同代码间的接口调用。
[0073] 图3示例性提供一种第二类线程初始化第二语言代码的运行环境的流程。在图3所提供的示例中,第一语言为JAVA,第二语言为Python。如图3所示,为了理解方便,将不同的语言视为不同的执行主体,然而应当理解,实际上是第二类线程基于不同的语言代码执行不同操作。
[0074] 图4示例性提供一种第一类线程初始化第二语言代码的子运行环境的流程。在图4所提供的示例中,第一语言为JAVA,第二语言为Python。如图4所示,为了理解方便,将不同的语言视为不同的执行主体,然而应当理解,实际上是第一类线程基于不同的语言代码执行不同操作。
[0075] 图5示例性提供一种第一类线程执行接口调用方法的流程。在图5所提供的示例中,第一语言为JAVA,第二语言为Python。如图5所示,为了理解方便,将不同的语言视为不同的执行主体,然而应当理解,实际上是第一类线程基于不同的语言代码执行不同操作。
[0076] 此外,在调用接口时,如果不需要携带参数或者仅仅需要携带单个参数,则可以避免构造变参Tuple的开销,利用第二语法支持的无参数或者单参数函数接口进行参数传递,提升无参数或者单参数函数的性能。例如,基于C语言代码,携带第二语言对象格式的计算参数调用第二接口时,可以利用单参数函数接口,避免构造变参Tuple的开销。
[0077] 数据处理进程有可能在推进数据处理过程中,可能在连续多个计算环节都需要实现依赖于同一第二函数的计算,为此,可以基于C语言代码,将上一次获取的第二函数的函数标识进行记录,以便在下一次需要该第二函数时,利用记录的函数标识快速定位该第二函数。
[0078] 在一些实施例中,用户可以在向计算节点配置自编写的第二语言代码时,选择设置后续将计算参数从基础数据类型数据映射到numpy array,同时,自编写的第二语言代码中包含支持numpy array格式的函数,如此,后续可以用该支持numpy array格式的函数处理numpy array格式的计算参数,利用numpy array支持的向量计算,提升计算性能。
[0079] 此外,本说明书中提供的用于实现图1所示流程以及各个实施例中相应步骤(如第一类线程的初始化步骤、第二类线程的初始化步骤)的软件包,可以摆脱对于计算节点的运行依赖与编译依赖。其中,可以预先将第二库存储至计算节点,对计算节点部署软件包时,可以动态读取第二库的路径,加载第二库,克服了软件包只能源码安装的问题。同时,由于可动态加载第二库,因此,也实现了软件包对于节点设备的可插拔特性,不需要重启计算节点上的第一虚拟机,就可以加载第二库。
[0080] 本说明书提供的数据流处理系统所支持的数据类型不仅可以包括常规的数据类型(如字符型、宽字符型、整型、浮点型、双浮点型、布尔型),还可以包括时间类型、Decimal类型等比较复杂的数据类型。
[0081] 本说明书还提供一种不同语言代码间的接口调用装置,应用于运行在第一虚拟机上的数据处理进程,在基于第一语言代码执行数据处理过程中,若确定需要基于预设的第二语言代码执行目标计算,则使用所述装置,所述装置包括:
[0082] 第一执行模块,基于第一语言代码,将相应的第一语言对象格式的计算参数转换成C对象格式的计算参数,并且以C对象格式的计算参数为接口输入,调用第一接口;第一接口是第一语言与C语言之间的标准交互接口;
[0083] 第二执行模块,基于预设的C语言代码,将C对象格式的计算参数转换成第二语言对象格式的计算参数,并且以第二语言对象格式的计算参数为接口输入,调用第二接口;第二接口是第二语言与C语言之间的标准交互接口;
[0084] 第三执行模块,基于第二语言代码,根据第二语言对象格式的计算参数执行目标计算,得到计算结果,将第二语言对象格式的计算结果转换成C对象格式的计算结果,并且以C对象格式的计算结果为接口输入,调用第二接口;
[0085] 第四执行模块,基于C语言代码,将C对象格式的计算结果转换成第一语言对象格式的计算结果,并且以第一语言对象格式的计算结果为接口输入,调用第一接口。
[0086] 本说明书还提供一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现非可信执行模块或可信执行模块的功能。
[0087] 本说明书还提供一种计算设备,包括存储器、处理器;所述存储器用于存储可在处理器上运行的计算机指令,所述处理器用于在执行所述计算机指令时实现非可信执行模块或可信执行模块的功能。
[0088] 上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
[0089] 为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
[0090] 本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD‑ROM、光学存储器等)上实施的计算机程序产品的形式。
[0091] 本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0092] 本说明书可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
[0093] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0094] 这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。在一个典型的配置中,计算机包括一个或多个处理器 (CPU)、输入/输出接口、网络接口和内存。
[0095] 内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器 (RAM) 和/或非易失性内存等形式,如只读存储器 (ROM) 或闪存(flash RAM)。内存是计算机可读介质的示例。
[0096] 计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存 (PRAM)、静态随机存取存储器 (SRAM)、动态随机存取存储器 (DRAM)、其他类型的随机存取存储器 (RAM)、只读存储器 (ROM)、电可擦除可编程只读存储器 (EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器 (CD‑ROM)、数字多功能光盘 (DVD) 或其他光学存储、磁盒式磁带、磁盘存储、量子存储器、基于石墨烯的存储介质或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体 (transitory media),如调制的数据信号和载波。
[0097] 还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
[0098] 综上所述,本说明书披露的一些实施例中,通过数字身份技术把数字化物品和数字身份连接,而前述数字身份可进一步包括身份认证信息以使得数字化物品的交易可以满足监管KYC的要求。在有些实施例中,部分或所有数字身份均完全实名认证,提供一个完全实名认证的基于区块链的交易系统。这样的系统有利于反洗钱发欺诈运营,成为一个真正可信交易系统。在一些实施例中,将数字化物品与数字身份所附随的记录、验证功能相结合,便可简便地对交易对象、交易参与方等交易要素进行记录及验证,进而提高交易的便利性和可靠性。在另一些实施例中,可不依赖数字身份,而由交易方的客户端调用区块链系统中的智能合约在链上创建数字化物品与其所有方之间的关联关系表,并将该等关联关系表存储于智能合约中,进而在链上对数字化物品的所有权归属进行可信记载。
[0099] 上述对本说明书多个实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0100] 在本说明书多个实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书多个实施例。在本说明书多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
[0101] 应当理解,尽管在本说明书多个实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书多个实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
[0102] 本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于方法实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的方法实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,在实施本说明书实施例方案时可以把各模块的功能在同一个或多个软件和/或硬件中实现。也可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
[0103] 以上所述仅为本说明书多个实施例的较佳实施例而已,并不用以限制本说明书多个实施例,凡在本说明书多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书多个实施例保护的范围之内。