一种基于Actor模型的异步调用方法和系统与流程
未命名
08-15
阅读:117
评论:0
一种基于actor模型的异步调用方法和系统
技术领域
1.本技术涉及计算机软件技术领域,特别涉及一种基于actor模型的异步调用方法及装置、计算设备和计算机可读存储介质。
背景技术:
2.在现有技术中,actor模型是一种常见的服务器并发模型,在游戏服务器领域应用广泛。对于actor模型来说,不同的语言有不同的实现,有基于c/c++结合脚本语言实现的模型、有基于golang的轻量级协程实现的actor模型、也有erlang自带的actor模型。但是这些模型都有各自的缺陷,c/c++结合脚本的方案实质上是由c/c++多线程调度,会有额外的消息传递开销;有的语言例如erlang,语法较为另类,流行度不如c#/golang,特别是在游戏领域,c#更为流行;golang等轻量级协程实现的actor模型,不能提供actor在处理异步调用挂起后其它消息的处理功能,因此,需要一种适合于开发游戏服务器的actor模型。
技术实现要素:
3.有鉴于此,本技术实施例提供了一种基于actor模型的异步调用方法及装置、计算设备和计算机可读存储介质,以解决现有技术中存在的技术缺陷。
4.根据本技术实施例的第一方面,提供了一种基于actor模型的异步调用方法,包括:
5.为每个actor创建两个本地消息队列,所述本地消息队列为可重入消息队列和非重入消息队列;
6.源actor产生消息,并将所述消息发送给目的actor的消息队列;
7.根据所述目的actor的执行状态进行线程调度,完成消息的处理。
8.根据本技术实施例的第二方面,提供了一种基于actor模型的异步调用装置,包括:
9.队列创建单元:用于为每个actor创建两个本地消息队列,所述本地消息队列为可重入消息队列和非重入消息队列;
10.消息产生单元:用于在actor中产生消息,并将所述消息发送给目的actor的消息队列;
11.调度模块:用于根据所述目的actor的执行状态进行线程调度,完成消息的处理。
12.根据本技术实施例的第三方面,提供了一种计算设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机指令,所述处理器执行所述指令时实现所述用于基于actor模型的异步调用方法的步骤。
13.根据本技术实施例的第四方面,提供了一种计算机可读存储介质,其存储有计算机指令,该指令被处理器执行时实现所述用于基于actor模型的异步调用方法的步骤。
14.本技术实施例中,为了实现一种高效的用于游戏服务器的actor模型,为每个actor建立了可重入消息队列和非重入消息队列;当actor的消息处理函数在处理消息时,
使用单线程的异步调用方法,在执行异步调用任务时挂起该任务,直接返回当前的线程并利用该线程执行可重入消息队列中的消息,从而实现了即时运行actor处理逻辑业务而无需等待异步调用任务的完成,满足了游戏即时性的特点。在本技术实施例的方法中,使用了满足c#异步调用规范的任务框架,保证了actor在处理同步或异步逻辑代码时,始终处在单一线程中,无需使用复杂的多线程编程方法,提高了软件工程实践的效率。
附图说明
15.图1是本技术实施例提供的计算设备的结构框图;
16.图2是本技术实施例提供的一种基于actor模型的异步调用方法的流程示意图;
17.图3是本技术实施例提供的一种基于actor模型的异步调用装置的结构示意图。
具体实施方式
18.在下面的描述中阐述了很多具体细节以便于充分理解本技术。但是本技术能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本技术内涵的情况下做类似推广,因此本技术不受下面公开的具体实施的限制。
19.在本技术一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本技术一个或多个实施例。在本技术一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本技术一个或多个实施例中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
20.应当理解,尽管在本技术一个或多个实施例中可能采用术语第一、第二等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本技术一个或多个实施例范围的情况下,第一也可以被称为第二,类似地,第二也可以被称为第一。取决于语境,如在此所使用的词语“如果”可以被解释成为“响应于确定”。
21.在本技术中,提供了一种基于actor模型的异步调用方法及装置、计算设备和计算机可读存储介质,在下面的实施例中逐一进行详细说明。
22.图1示出了根据本技术实施例的计算设备100的结构框图。该计算设备100的部件包括但不限于存储器110和处理器120。处理器120与存储器110通过总线130相连接,数据库150用于保存数据。
23.计算设备100还包括接入设备140,接入设备140使得计算设备100能够经由一个或多个网络160通信。这些网络的示例包括公用交换电话网(pstn)、局域网(lan)、广域网(wan)、个域网(pan)或诸如因特网的通信网络的组合。接入设备140可以包括有线或无线的任何类型的网络接口(例如,网络接口卡(nic))中的一个或多个,诸如ieee802.11无线局域网(wlan)无线接口、全球微波互联接入(wi-max)接口、以太网接口、通用串行总线(usb)接口、蜂窝网络接口、蓝牙接口、近场通信(nfc)接口,等等。
24.在本技术的一个实施例中,计算设备100的上述部件以及图1中未示出的其他部件也可以彼此相连接,例如通过总线。应当理解,图1所示的计算设备结构框图仅仅是出于示例的目的,而不是对本技术范围的限制。本领域技术人员可以根据需要,增添或替换其他部
件。
25.计算设备100可以是任何类型的静止或移动计算设备,包括移动计算机或移动计算设备(例如,平板计算机、个人数字助理、膝上型计算机、笔记本计算机、上网本等)、移动电话(例如,智能手机)、可佩戴的计算设备(例如,智能手表、智能眼镜等)或其他类型的移动设备,或者诸如台式计算机或pc的静止计算设备。计算设备100还可以是移动式或静止式的服务器。
26.在游戏服务器开发过程中,为了使得服务器的功能符合游戏业务特点和通用性,同时减轻编写多线程逻辑代码的复杂性,通常使用actor模型框架,以便使用单线程规则编写逻辑代码。在现有技术中,c++/c结合脚本的actor模型有一些语言上的不利之处,如语言特性、共享数据处理、对开发人员的技能要求等。而c#语言在游戏开发中十分流行,其服务器开发框架.net也已经完善,在提供跨平台的同时,也能保证极高的运行效率。因此c#语言下的通用actor模型框架对游戏开发有极大的意义,另外结合c#本身的语言特性,在实现actor模型上有区别于其它语言的优点,能够更方便编写业务代码,提高业务开发效率。
27.因此,在本技术实施例中,为了解决上述问题,提出了一种基于actor模型的异步调用方法,参见图2,图2示出了根据本技术一实施例提供的一种基于actor模型的异步调用方法的流程图,包括步骤202至步骤206。
28.步骤202:为每个actor创建两个本地消息队列,该本地消息队列为可重入消息队列和非重入消息队列。
29.在现有技术中,每个actor都有且仅有一个mailbox,mailbox相当于一个小型的队列,一旦发送者发送消息给目标actor,就将该消息入队到mailbox中。入队的顺序按照消息发送的时间顺序。这样的设计解耦了actor之间的关系,每个actor都处理各自的mailbox。虽然所有actor可以同时运行,但它们处理mailbox消息时是单线程的,只能在当前消息处理完毕后才会处理mailbox中的下一个消息,执行效率较低。
30.在本技术的一个可行的实施方式中,为每个actor创建两个本地消息队列,其中第一消息队列为可重入消息队列、第二消息队列为非重入消息队列。actor同时从这两个队列中获取并处理消息。
31.其中,可重入在本领域的定义为:指某段程序代码还没有执行完,因为中断或者线程调度,导致后续程序代码在新的上下文中执行而不影响执行的结果,从而称这段程序代码为可重入的,例如:可重入的函数可以被称为可中断的函数,在运行某个函数时因为某个原因而中止了函数的运行,等到问题解决后,重新进入该函数继续运行,其执行结果不会受到影响,和没有被打断时的运行结果一样。而非重入的定义则正好相反,中断后再恢复执行时,其执行结果很可能发生变化,因此这类程序代码是不能运行在多任务环境下的
32.因此,在可重入消息队列中记录的消息也具有可重入的特性,可重入消息队列中的消息在被actor处理时发生了中断后恢复执行时,不影响该消息的处理结果。例如,处理玩家基础成长的消息一般是可重入消息。
33.在非重入消息队列中记录的消息则不具备可重入的特性,不允许在执行的过程中发生中断。例如,排行榜、联盟变更操作这样针对公共数据的修改都为非重入消息。
34.进一步的,在产生actor消息时,根据消息的不同类型,即是否是可重入消息产生不同的消息实例并推送到对应的消息队列中,如下代码所示意:
[0035][0036][0037]
步骤204:源actor产生消息,并将该消息发送给目的actor的消息队列;
[0038]
在一种可行的实施方式中,当源actor产生消息后,根据该消息的可重入与否,以及目的actor的地址,将产生的消息发送给目的actor的可重入消息队列或者非重入消息队列。
[0039]
进一步的,当源actor进行消息发送时,依据该消息是否返回结果将消息分成两种类型,其中,第一类型需要等待返回的消息处理结果,第二类型无需等待消息处理结果。其中,当源actor发送的消息为第一类型时,挂起源actor,直到源actor接收到消息处理结果。
[0040]
步骤206:根据目的actor的执行状态进行调度,完成消息的处理。
[0041]
在本技术的实施例中,当消息被投递到目的actor时,调度器根据目的actor的运行状态进行线程调度,完成消息的处理。其中,
[0042]
如果目的actor处在空闲状态,执行线程调度运行该actor,直接执行消息队列中的消息。
[0043]
如果目的actor处在运行状态,将消息发送到目的actor的可重入消息队列或者非重入消息队列中,等待执行。
[0044]
如果目的actor处在挂起状态,根据消息的类型,即可重入与否执行线程调度。具体的,若目的actor的消息处理函数正在处理异步调用任务时,该异步调用任务被挂起,但当前线程并没有被阻塞,从而能执行其他任务。因此,在目的actor在执行异步调用任务被挂起时,若可重入消息队列中有消息等待,继续在当前线程中处理可重入消息队列中的消息,无需等待被挂起的异步调用任务。
[0045]
具体的,在c#语言中,使用语法async/await来完成单线程中的异步调用,在目标actor的消息处理函数中,使用async关键字将消息处理函数标记为异步方法,用await标记该方法内需要异步处理的任务。actor的线程碰到await关键字时消息处理函数挂起,而当前的线程会立即返回,继续以非阻塞形式执行其他的任务。如在下面的示意代码中,当线程
在执行到await task时,函数oncompletedasync被挂起,但当前的线程此时并没有被阻塞,此时,根据可重入消息的特性,在当前线程中继续执行可重入消息队列中的消息。
[0046][0047]
在另一种可行的实施方式中,当消息队列中都没有消息时,使actor处于空闲状态,减少cpu空转。
[0048]
在本技术的上述实施例中,为了实现一种高效的用于游戏服务器的actor模型,对actor的接收消息进行了分类,为每个actor建立两个消息队列,包括可重入消息队列和非重入消息队列;当actor的消息处理函数在处理消息时,使用单线程的异步调用方法,在执行异步调用任务时挂起该任务,直接返回当前的线程并利用该线程执行可重入消息队列中的消息而不是对每个消息都进行等待,从而实现了即时运行actor处理特定的逻辑业务而无需等待异步调用任务的完成,满足了游戏即时性的特点。其中,在该方法中使用了满足c#异步调用规范的任务框架,保证了actor在处理同步或异步逻辑代码时,始终处在单一线程中,无需使用复杂的多线程编程方法。
[0049]
与上述方法实施例相对应,本技术还提供了一种基于actor模型的异步调用装置的实施例,如图3所示,该装置包括:
[0050]
队列创建单元:用于为每个actor创建两个本地消息队列,所述本地消息队列为可重入消息队列和非重入消息队列;
[0051]
消息产生单元:用于在actor中产生消息,并将所述消息发送给目的actor的消息队列;
[0052]
调度模块:用于根据所述目的actor的执行状态进行线程调度,完成消息的处理。
[0053]
上述为本实施例的一种基于actor模型的异步调用装置的示意性方案。需要说明的是,该装置的技术方案与上述的一种基于actor模型的异步调用方法的技术方案属于同一构思,该装置的技术方案未详细描述的细节内容,均可以参见上述一种基于actor模型的异步调用方法的技术方案的描述。
[0054]
本技术一实施例中还提供一种计算设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机指令,所述处理器执行所述指令时实现所述的一种基于actor模型的异步调用方法的步骤。
[0055]
上述为本实施例的一种计算设备的示意性方案。需要说明的是,该计算设备的技
术方案与上述的一种用于基于actor模型的异步调用方法的技术方案属于同一构思,计算设备的技术方案未详细描述的细节内容,均可以参见上述一种基于actor模型的异步调用方法的技术方案的描述。
[0056]
本技术一实施例还提供一种计算机可读存储介质,其存储有计算机指令,该指令被处理器执行时实现如前所述一种基于actor模型的异步调用方法的步骤。
[0057]
上述为本实施例的一种计算机可读存储介质的示意性方案。需要说明的是,该存储介质的技术方案与上述的一种基于actor模型的异步调用方法的技术方案属于同一构思,存储介质的技术方案未详细描述的细节内容,均可以参见上述一种基于actor模型的异步调用方法的技术方案的描述。
[0058]
上述对本技术特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0059]
所述计算机指令包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
[0060]
需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本技术并不受所描述的动作顺序的限制,因为依据本技术,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本技术所必须的。
[0061]
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
[0062]
以上公开的本技术优选实施例只是用于帮助阐述本技术。可选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本技术的内容,可作很多的修改和变化。本技术选取并具体描述这些实施例,是为了更好地解释本技术的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本技术。本技术仅受权利要求书及其全部范围和等效物的限制。
技术特征:
1.一种基于actor模型的异步调用方法,其特征在于,包括:为每个actor创建两个本地消息队列,所述本地消息队列为可重入消息队列和非重入消息队列;源actor产生消息,并将所述消息发送给目的actor的消息队列;根据所述目的actor的执行状态进行线程调度,完成所述消息的处理。2.根据权利要求1所述的方法,其中,所述源actor产生消息,并将该消息发送给目的actor的消息队列包括:当所述源actor进行消息发送时,依据该消息是否返回结果将消息分成两种类型,其中,第一类型需要等待返回消息处理结果,第二类型无需等待消息处理结果;其中,当所述源actor发送的消息为第一类型时,挂起源actor,直到源actor接收到消息处理结果。3.根据权利要求1所述的方法,其中,所述源actor产生消息,并将该消息发送给目的actor的消息队列还包括:当源actor产生消息后,根据所述消息的可重入与否以及目的actor的地址,将产生的消息发送给目的actor的可重入消息队列或者非重入消息队列。4.根据权利要求3所述的方法,其中,所述根据目的actor的执行状态进行线程调度,完成消息的处理包括:如果所述目的actor处在挂起状态,根据可重入消息队列中的消息数量执行线程调度;其中,所述目的actor的线程在处理可重入消息时,无需等待当前消息处理函数的处理结果。5.根据权利要求4所述的方法,其中,所述根据目的actor的执行状态进行线程调度,完成消息的处理还包括:如果所述目的actor处在空闲状态,执行线程调度运行所述目的actor,直接执行消息队列中的消息;如果所述目的actor处在运行状态,将消息发送到所述目的actor的消息队列中,等待执行。6.根据权利要求5所述的方法,其中,所述根据所述目的actor的执行状态进行线程调度还包括:当消息队列中都没有消息时,使得actor处于空闲状态。7.根据权利要求1所述的方法,其中,使用c#语言的async/await关键字对actor的消息处理函数进行描述,完成所述异步调用。8.一种基于actor模型的异步调用装置,其特征在于,包括:队列创建单元:用于为每个actor创建两个本地消息队列,所述本地消息队列为可重入消息队列和非重入消息队列;消息产生单元:用于在actor中产生消息,并将所述消息发送给目的actor的消息队列;调度模块:用于根据所述目的actor的执行状态进行线程调度,完成消息的处理。9.一种计算设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机指令,其特征在于,所述处理器执行所述指令时实现权利要求1-7任意一项所述方法的步骤。
10.一种计算机可读存储介质,其存储有计算机指令,其特征在于,该指令被处理器执行时实现权利要求1-7任意一项所述方法的步骤。
技术总结
本申请提供一种基于Actor模型的异步调用方法及装置,其中,在该方法中,为了实现一种高效的用于游戏服务器的Actor模型,为每个Actor建立了不同类型的消息队列。当Actor的消息处理函数在处理消息时,使用单线程的异步调用方法,将异步调用任务挂起后直接返回当前的线程并利用该线程执行可重入消息队列中的消息,从而实现了即时运行Actor处理逻辑业务而无需等待异步调用任务的完成,满足了游戏即时性的特点。而且,在本申请实施例的方法中,使用了满足C#异步调用规范的任务框架,保证了Actor在处理同步或异步逻辑代码时,始终处在单一线程中,无需使用复杂的多线程编程方法,提高了软件工程实践的效率。件工程实践的效率。件工程实践的效率。
技术研发人员:扈红柯 郭子文 李建良 乐坚强 杨东 何雨泉 林逸 杨利华
受保护的技术使用者:北京云游互动网络科技有限公司
技术研发日:2023.01.04
技术公布日:2023/8/14
版权声明
本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
飞行汽车 https://www.autovtol.com/
