一种Lamda编程模型及其数据处理方法与流程

文档序号:20510590发布日期:2020-04-24 18:29阅读:193来源:国知局
一种Lamda编程模型及其数据处理方法与流程

本发明涉及软件编程技术,更具体的说,是涉及一种lamda编程模型及其数据处理方法。



背景技术:

事件驱动编程是一种编程范式,其程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。

对于网络编程来说,最重要的就是逻辑处理过程的有序性,因为网络延迟、丢包、阻塞、异常关闭等问题,导致对于这些事件的发生不可能使用轮询的方式去解决,以避免效率低和时序无法保证的问题。

i/o多路复用就是进程预先告诉内核需要监视的i/o条件,使得内核一旦发现进程指定的一个或多个i/o条件就绪,就通过进程处理,从而不会在单个i/o上阻塞了。

现有的异步i/o多路复用模型比如libevent、只是单独针对事件的处理,而对其它投递对象,比如函数或消息则没有处理。



技术实现要素:

有鉴于此,本发明提供了一种lamda编程模型及其数据处理方法,以实现对多种类型的投递函数进行集中处理。

为实现上述目的,本发明提供如下技术方案:

一种lamda编程模型,包括lamdaapi、管道和lamdarotine;

其中,所述lamdaapi用于接收投递对象,并将接收到的投递对象写入管道,所述投递对象包括消息、函数和套接字中的至少一种;

所述管道用于暂存所述lamdaapi写入的所述投递对象;

所述lamdarotine用于监控所述管道状态,在监控到所述管道中写入了新的投递对象时,获取所述管道中新写入的投递对象,基于epoll处理器根据所述投递对象的类型将其分发至对应的处理流程进行处理。

可选的,所述处理流程包括:

消息处理流程,用于在接收到所述epoll处理器分发给自身的消息时,根据所述消息数据中的消息值、消息参数和消息处理函数对所述消息进行处理;

执行函数流程,用于在接收到所述epoll处理器分发给自身的函数时,根据所述函数中注册的函数和参数直接执行所述函数;

套接字处理流程,用于在接收到所述epoll处理器分发给自身的套接字时,根据所述套接字中的套接字数据、事件类型、事件处理函数和用户指针对所述套接字进行处理。

可选的,所述lamdaapi还用于:在接收到投递对象为消息时,注册与所述消息相关的回调函数。

可选的,所述lamdaapi具体用于:

接收投递对象,以固定的数据结构将投递对象写入管道。

可选的,所述套接字包括fd句柄。

一种lamda编程模型的数据处理方法,应用于上述任一种lamda编程模型,包括:

lamdaapi接收投递对象,并将接收到的投递对象写入管道,所述投递投递对象包括消息、函数和套接字中的至少一种;

lamdarotine在监听到所述管道中有新的数据写入时,获取所述管道中新写入的投递对象并放入epoll处理器;

所述epoll处理器根据所述投递对象的类型将其分发至对应的处理流程;

各个处理流程对接收到的投递对象进行处理。

可选的,所述处理流程包括消息处理流程、执行函数流程和套接字处理流程,则所述各个处理流程对接收到的投递对象进行处理,包括:

消息处理流程在接收到所述epoll处理器分发给自身的消息时,根据所述消息数据中的消息值、消息参数和消息处理函数对所述消息进行处理;

和/或,执行函数流程在接收到所述epoll处理器分发给自身的函数时,根据所述函数中注册的函数和参数直接执行所述函数;

和/或,套接字处理流程在接收到所述epoll处理器分发给自身的套接字时,根据所述套接字中的套接字数据、事件类型、事件处理函数和用户指针对所述套接字进行处理。

可选的,还包括:

lamdaapi在接收到投递对象为消息时,注册与所述消息相关的回调函数。

可选的,所述lamdaapi接收投递对象,并将接收到的投递对象写入管道,包括:

lamdaapi接收投递对象,以固定的数据结构将投递对象写入管道。

可选的,所述套接字为fd句柄。

经由上述的技术方案可知,与现有技术相比,本发明实施例公开了一种lamda编程模型及其数据处理方法,lamda编程模型包括lamdaapi、管道和lamdarotine,lamdaapi用于接收投递对象,并将接收到的投递对象写入管道,所述投递投递对象包括消息、函数和套接字中的至少一种,管道用于暂存所述lamdaapi写入的所述投递对象,lamdarotine用于监控所述管道状态,在监控到所述管道中写入了新的投递对象时,获取所述管道中新写入的投递对象,基于epoll处理器根据所述投递对象的类型将其分发至对应的处理流程进行处理。所述lamda编程模型及其数据处理方法能够通过lamdaapi将多种类型的投递函数集中到单个线程进行处理,降低开发难度。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为本发明实施例公开的lamda编程模型的结构示意图;

图2为本发明实施例公开的一种lamda编程模型的数据处理方法流程图;

图3为本发明实施例公开的另一种lamda编程模型的数据处理方法流程图。

具体实施方式

为了引用和清楚起见,下文中使用的技术名词的说明、简写或缩写总结如下:

lambda表达式:“lambda表达式”(lambdaexpression)是一个匿名函数,lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambdaabstraction),是一个匿名函数,即没有函数名的函数。lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

同步:所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。

异步:异步的概念和同步相对。当c端一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。

非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

io复用模型:主要是select和epoll;对一个io端口,两次调用,两次返回,比阻塞io并没有什么优越性;关键是能实现同时对多个io端口进行监听;

i/o复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,但是和阻塞i/o所不同的的,这两个函数可以同时阻塞多个i/o操作。而且可以同时对多个读操作,多个写操作的i/o函数进行检测,直到有数据可读或可写时,才真正调用i/o操作函数。

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

图1为本发明实施例公开的lamda编程模型的结构示意图,参见图1所示,lamda编程模型可以包括lamdaapi、管道和lamdarotine,图1中,lamdaapi的标号为101,管道的标号为102,lamdarotine的标号为103。

其中,所述lamdaapi用于接收投递对象,并将接收到的投递对象写入管道,所述投递对象包括消息、函数和套接字中的至少一种。

本实施例中,对于lamdaapi的实现,首先可以创建一个lamda轮询对象,可以设定lamda轮询对象的名称,每个lamda轮询对象可以对应一个线程,其中可以设定加入的套接字,如fd句柄的大小、消息队列的缓冲区大小等内容。

实际应用中,lamdaapi的主要工作内容是针对投递对象的,如:接收函数执行体、消息、套接字,并注册相应的回调函数、用于不同对象被触发时的响应。可以类比成是lamda的客户端,用于投递补各类对象,从而将处理集中到服务端的单线程的i/o多路复用模型中统一处理。

所述管道用于暂存所述lamdaapi写入的所述投递对象。

所述lamdarotine用于监控所述管道状态,在监控到所述管道中写入了新的投递对象时,获取所述管道中新写入的投递对象,基于epoll处理器根据所述投递对象的类型将其分发至对应的处理流程进行处理。

本实施例中,lamdaapi与lamdaroutine间为了避免lamda_routine线程采用轮询导致效率低且无法即时响应的问题,本实施例采用管道机制,写端套接字交给lamda_api、而读端交给lamda_routine线程,并将读端的套接字加入到epoll处理器中、因此只要有数据被写入即可被触发,从而快速处理。

本实施例中,lamda编程模型是基于单线程异步i/o多路复用epoll开发模型实现的,由lamda_routine线程创建epoll并等待,当有i/o请求(socket)到达时,将其加入epoll中,后续根据实际的读或写或其它请求条件中被触发被处理。流程可以包括,lamdaapi将投递对象:函数、套接字和消息等写入管道中,epoll处理器中的管道读事件会被触发,epoll处理器将根据不同的对象进行分发处理:

消息类型:epoll处理器收到消息时,将其转发到消息处理函数(或消息处理流程)中,然后消息处理函数根据不同的消息值进行处理,根据消息的先后依次处理,先到先处理。

函数类型:epoll处理器收到函数类型对象时,将取出注册的函数和参数直接执行。

套接字类型:epoll处理器收到套接字类型对象时,需要做的是将套接字加入到epoll处理器中、并记录下套接字对应的索引值和注册的事件处理函数。

本实施例中,所述lamda编程模型能够通过lamdaapi将多种类型的投递函数集中到单个线程进行处理,降低开发难度。且lamda编程模型利用单线程异步i/o多路复用epoll开发模型实现,能够保证逻辑处理的流程串行化。

上述实施例中,投递对象可以包括消息、函数、套接字等类型。其中:

函数具体可以是函数执行体,处理过程包括将一个可执行函数的地址及函数参数传到lamda_routine中异步执行。

消息的处理过程可以包括:将消息投递中lamda_routine的消息队列中,由专门函数进行消息处理并回调给注册消息的回调函数中。允许最长的消息长度是1024字节。

套接字可以是fd句柄,处理过程可以包括:在lamda_routine中利用epoll实现高效的异步的i/o多路复用、并根据注册的可读,可写或错误等事件及事件回调函数,lamda_routine线程在数据到来之前处于阻塞状态,等到数据到达,会自动唤醒事件回调函数线程,着手进行处理。

由此,lamdarotine中的处理流程包括:

消息处理流程,用于在接收到所述epoll处理器分发给自身的消息时,根据所述消息数据中的消息值、消息参数和消息处理函数对所述消息进行处理;

执行函数流程,用于在接收到所述epoll处理器分发给自身的函数时,根据所述函数中注册的函数和参数直接执行所述函数;

套接字处理流程,用于在接收到所述epoll处理器分发给自身的套接字时,根据所述套接字中的套接字数据、事件类型、事件处理函数和用户指针对所述套接字进行处理。

在其他的实施例中,所述lamdaapi还用于:在接收到投递对象为消息时,注册与所述消息相关的回调函数。以便于在流程满足特定事件时,相应的回调函数被执行。

在其他的实施例中,所述lamdaapi具体用于:接收投递对象,以固定的数据结构将投递对象写入管道。便于数据的统一识别、管理。

上述本发明公开的实施例中详细描述了lamda编程模型,下面本发明还公开了一种lamda编程模型的数据处理方法,下面给出具体的实施例进行详细说明。

图2为本发明实施例公开的一种lamda编程模型的数据处理方法流程图,参见图2所示,lamda编程模型的数据处理方法包括:

步骤201:lamdaapi接收投递对象,并将接收到的投递对象写入管道,所述投递投递对象包括消息、函数和套接字中的至少一种。

本实施例中,对于lamdaapi的实现,首先可以创建一个lamda轮询对象,可以设定lamda轮询对象的名称,每个lamda轮询对象可以对应一个线程,其中可以设定加入的套接字,如fd句柄的大小、消息队列的缓冲区大小等内容。

实际应用中,lamdaapi的主要工作内容是针对投递对象的,如:接收函数执行体、消息、套接字,并注册相应的回调函数、用于不同对象被触发时的响应。可以类比成是lamda的客户端,用于投递补各类对象,从而将处理集中到服务端的单线程的i/o多路复用模型中统一处理。

步骤202:lamdarotine在监听到所述管道中有新的数据写入时,获取所述管道中新写入的投递对象并放入epoll处理器。

本实施例中,lamdaapi与lamdaroutine间为了避免lamda_routine线程采用轮询导致效率低且无法即时响应的问题,本实施例采用管道机制,写端套接字交给lamda_api、而读端交给lamda_routine线程,并将读端的套接字加入到epoll处理器中、因此只要有数据被写入即可被触发,从而快速处理。

步骤203:所述epoll处理器根据所述投递对象的类型将其分发至对应的处理流程。

本实施例中,lamda编程模型是基于单线程异步i/o多路复用epoll开发模型实现的,由lamda_routine线程创建epoll并等待,当有i/o请求(socket)到达时,将其加入epoll中,后续根据实际的读或写或其它请求条件中被触发被处理。流程可以包括,lamdaapi将投递对象:函数、套接字和消息等写入管道中,epoll处理器中的管道读事件会被触发,epoll处理器将根据不同的对象进行分发处理:

消息类型:epoll处理器收到消息时,将其转发到消息处理函数(或消息处理流程)中,然后消息处理函数根据不同的消息值进行处理,根据消息的先后依次处理,先到先处理。

函数类型:epoll处理器收到函数类型对象时,将取出注册的函数和参数直接执行。

套接字类型:epoll处理器收到套接字类型对象时,需要做的是将套接字加入到epoll处理器中、并记录下套接字对应的索引值和注册的事件处理函数。

步骤204:各个处理流程对接收到的投递对象进行处理。

所述处理流程包括消息处理流程、执行函数流程和套接字处理流程,则所述各个处理流程对接收到的投递对象进行处理,可以包括:

消息处理流程在接收到所述epoll处理器分发给自身的消息时,根据所述消息数据中的消息值、消息参数和消息处理函数对所述消息进行处理;

和/或,执行函数流程在接收到所述epoll处理器分发给自身的函数时,根据所述函数中注册的函数和参数直接执行所述函数;

和/或,套接字处理流程在接收到所述epoll处理器分发给自身的套接字时,根据所述套接字中的套接字数据、事件类型、事件处理函数和用户指针对所述套接字进行处理。

本实施例中,所述lamda编程模型能够通过lamdaapi将多种类型的投递函数集中到单个线程进行处理,降低开发难度。且lamda编程模型利用单线程异步i/o多路复用epoll开发模型实现,能够保证逻辑处理的流程串行化。

图3为本发明实施例公开的另一种lamda编程模型的数据处理方法流程图,如图3所示,lamda编程模型的数据处理方法可以包括:

步骤301:lamdaapi接收投递对象,并将接收到的投递对象写入管道,所述投递投递对象包括消息、函数和套接字中的至少一种。

步骤302:lamdaapi在接收到投递对象为消息时,注册与所述消息相关的回调函数。

注册回调函数,以便于在流程满足特定事件时,相应的回调函数被执行。

步骤303:lamdarotine在监听到所述管道中有新的数据写入时,获取所述管道中新写入的投递对象并放入epoll处理器。

步骤304:所述epoll处理器根据所述投递对象的类型将其分发至对应的处理流程。

步骤305:各个处理流程对接收到的投递对象进行处理,在执行到所述回调函数的指针时,通过所述指针执行所述回调函数。

本实施例中,在投递对象为消息时,lamdaapi还用于注册与所述消息相关的回调函数,以便于在流程满足特定事件时,相应的回调函数被执行。保证流程处理的逻辑性。

在其他的实施例中,所述lamdaapi接收投递对象,并将接收到的投递对象写入管道,包括:lamdaapi接收投递对象,以固定的数据结构将投递对象写入管道。便于数据的统一识别、管理。

本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。

还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或技术领域内所公知的任意其它形式的存储介质中。

对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1