首页 / 软件开发 / .NET编程技术 / ActorLite:一个轻量级Actor模型实现(中)
ActorLite:一个轻量级Actor模型实现(中)2011-04-05 博客园 Jeffrey Zhao从上一篇文章的反响来看,似乎大家对于这一话题并没有太大兴趣。而这篇文章将会 为大家带来一个简单但完整的Actor模型实现。此外,在下一篇文章中……可能会出现一 些让您觉得有趣的东西。:)任务分配逻辑如上文所述,这次要实现的是一个非常简单的Actor模型,使用基于事件的分配方式, 直接把任务交给.NET自带的线程池去使用。不过我们又该什么时候把一个Actor推入线程 池的执行队列呢?这其实取决于我们执行Actor的两个“基本原则”:如果Actor的邮箱中包含消息,那么要尽早执行。对于单个Actor对象来说,它的消息是顺序执行的。因此,我们有两个“时机”可以把一个Actor交由线程池去执行:当Actor接收到一个消息(且该Actor处于“等待”状态)当Actor执行完一个消息(且Actor的邮箱中存在更多消息)显然,在进行操作时需要小心处理并发造成的问题,因为一个“执行完”和多个“接 受到”事件可能同时出现。如果操作不当,则容易出现各种错误的情况:某个Actor的邮箱未空,却已停止执行。同一个Actor的两个消息被并行地处理。Actor的邮箱已经没有消息,却被要求再次执行。至于并行控制的方式,就请关注下面的实现吧。简单的Actor模型实现Actor模型中最关键的莫过于Actor对象的实现。一个Actor的功能有如下三种:将消息放入邮箱接受并处理消息循环/退出循环因此Actor抽象类对外的接口大致如下:public abstract class Actor<T> : IActor
{
protected abstract void Receive(T message);
protected void Exit() { ... }
public void Post(T message) { ... }
}
三个方法的签名应该已经充分说明了各自的含义。不过IActor又是什么呢?请看它的 定义:internal interface IActor
{
void Execute();
bool Existed { get; }
int MessageCount { get; }
ActorContext Context { get; }
}