Skip to content
bobohume edited this page Feb 18, 2021 · 4 revisions

Actor概念

一个actor是一个基本的计算单元,通常actor会接收消息,然后基于消息来做某些计算。

这种概念跟面向对象(OOP)编程语言非常类似:一个object接收消息(对应为OOP中的方法调用),然后基于该消息来做一些事情。但是,Actor并发模型的不同之处在于:每个actor是完全隔离的,他们不会共享内存;同时,actor也会维护自身的私有状态,并且不会直接被其他的actor修改。

通俗来讲就像邮箱

gonet的actor模块解析

actor结构

   Actor struct {
	m_CallChan  chan CallIO//rpc信道
	m_AcotrChan chan int//actor(关闭)状态信道
	m_Id       	 int64//唯一id
	m_CallMap	 map[string] *CallFunc//rpc 回调
	m_pTimer 	 *time.Ticker//定时器
	m_TimerCall	func()//定时器触发函数
	m_bStart	bool
}
actor包函io消息队列,定时器,由于actor的隔离性,定时器最好再一个goroutine里面。

actor方法

Init(chanNum int)//初始化信道
RegisterCall(funcName string, call interface{})//rpc回调
SendMsg(head rpc.RpcHead, funcName string, params ...interface{})//调用rpc
RegisterTimer(duration time.Duration, fun interface{})//定时器回调
GetRpcHead(ctx context.Context) rpc.RpcHead//rpc包头

actor调用

actor.SendMsg(funcName string, params ...interface{})//actor靠它来传输消息 funcName为回调函数名字 params可以是基础类型:int,uint32,*int,*uint32,[]int,[]uint32,[6]int,[6]uint32,支持结构体不需要注册

actor.RegisterCall(ctx context.Context, funcName string, call interface{})//actor靠他来进行消息回调 funcName为回调函数名字 call为SendMsg传过来的params

SendMsg("COMMON_RegisterRequest",ServerType, Ip, Port)//发送给actor一个消息队列
this.RegisterCall("COMMON_RegisterRequest", func(ctx context.Context, nType int, Ip string, Port int) {

gonet所有模块都是一个actor,比如聊天,邮件,排行榜,甚至玩家也是细分到互不相干的actor

Clone this wiki locally