-
Notifications
You must be signed in to change notification settings - Fork 346
acotr
bobohume edited this page Feb 18, 2021
·
4 revisions
一个actor是一个基本的计算单元,通常actor会接收消息,然后基于消息来做某些计算。
这种概念跟面向对象(OOP)编程语言非常类似:一个object接收消息(对应为OOP中的方法调用),然后基于该消息来做一些事情。但是,Actor并发模型的不同之处在于:每个actor是完全隔离的,他们不会共享内存;同时,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里面。
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.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