概念
事件在这里可以理解为消息到达事件,事件到来时才为Actor分配线程并执行消息的处理。这样便可以使用少量的线程来执行大量Actor产生的任务,Actor有消息要处理的时候才占用CPU,没有的时候就挂起,保证了每个线程都在高效执行任务。
Actor模型组成
- cpu
用于执行线程,目前单机上为多核。 - workthread
工作线程,保证线程数目<=cpu核数,否则只会把cpu时间浪费在线程切换上。
工作线程跑的调度函数大致是这样的
queue<ActorStruct*> gmq; //全局变量,存储需要进行调度的Actor的队列。
void scheduler() {
while(true) {
ActorStruct* actor = gmq_pop(); //尝试从gmq中获取一个需要调度的Actor
void* msg = actor->mq.pop(); //从actor的mq中获取一条消息
actor->dispatch(msg); //执行回调函数,处理消息
}
}
- ActorStruct
每个Actor的数据结构是这样的
struct ActorStruct {
queue<msg> mq; //消息队列
void dispatch(void* msg); //