根据老赵轻量级Actor进行修改的Actor模型
学习了老赵轻量级Actor模型,并在实际中使用,效果不错。
老赵轻量级Actor模型:
ActorLite:一个轻量级Actor模型实现(上)
ActorLite:一个轻量级Actor模型实现(中)
ActorLite:一个轻量级Actor模型实现(下)
但是在使用此模式的过程中,在message出队列时出现问题,出现queue.count == 0的异常,没能分析出问题的原因,暂时做了一个临时性的解决方案,也并没有测试对性能的影响。
/// <summary>
/// Actor模型接口
/// </summary>
internal interface IActor
{
/// <summary>
/// 执行
/// </summary>
void Execute();
/// <summary>
/// 退出标志
/// </summary>
bool Exited { get; }
/// <summary>
/// 消息个数
/// </summary>
int MessageCount { get; }
/// <summary>
/// Actor上下文
/// </summary>
ActorContext Context { get; }
} /// <summary>
/// Actor上下文类
/// </summary>
internal class ActorContext
{
// 表示某一时期处理消息的状态
public int Status; /// <summary>
/// 保存Actor模型类的引用
/// </summary>
public IActor Actor { get; private set; } /// <summary>
/// 构造函数
/// </summary>
/// <param name="actor"></param>
public ActorContext(IActor actor)
{
this.Actor = actor;
} // Actor模型执行状态,包括 等待、执行和退出三个状态
public const int Waiting = ;
public const int Executing = ;
public const int Exited = ;
} /// <summary>
/// Actor模型类
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class Actor<T> : IActor
{
// Actor上下文对象
private readonly ActorContext _context; // Exit flag
private bool _exited = false; // Message queue
private readonly ConcurrentQueue<T> _messageQueue = new ConcurrentQueue<T>(); /// <summary>
/// 投递消息
/// </summary>
/// <param name="message"></param>
public void Post(T message)
{
if (this._exited)
{
return;
}
this._messageQueue.Enqueue(message);
// 准备执行处理一个消息
Dispatcher.Instance.ReadyToExecute(this);
} // 接收并处理消息
protected abstract void Receive(T message); /// <summary>
/// Constructor
/// </summary>
protected Actor()
{
this._context = new ActorContext(this);
} #region Properties
/// <summary>
/// Actor上下文
/// </summary>
ActorContext IActor.Context
{
get { return this._context; }
}
/// <summary>
/// 是否退出标志
/// </summary>
bool IActor.Exited
{
get { return this._exited; }
}
/// <summary>
/// 消息队列中消息个数
/// </summary>
int IActor.MessageCount
{
get { return this._messageQueue.Count; }
}
#endregion /// <summary>
/// 处理消息
/// </summary>
void IActor.Execute()
{
T message;
var dequeueSucess = this._messageQueue.TryDequeue(out message); if (dequeueSucess)
{
this.Receive(message);
}
} protected void Start()
{
this._exited = false;
}
/// <summary>
/// 退出模式
/// </summary>
protected void Exit()
{
this._exited = true;
}
} /// <summary>
/// 分发类
/// </summary>
internal class Dispatcher
{
// Singleton
private static readonly Dispatcher _instance = new Dispatcher(); public static Dispatcher Instance
{
get { return _instance; }
} /// <summary>
/// Private Constructor
/// </summary>
private Dispatcher()
{ } /// <summary>
/// 消息预处理:设置处理状态
/// </summary>
/// <param name="actor"></param>
public void ReadyToExecute(IActor actor)
{
if (actor.Exited) return;
// 修改当前状态为执行态
int status = Interlocked.CompareExchange(ref actor.Context.Status, ActorContext.Executing, ActorContext.Waiting); if (status == ActorContext.Waiting)
{
// 线程池的可用工作线程处理消息
ThreadPool.QueueUserWorkItem(this.Execute, actor);
}
} /// <summary>
/// 消息处理
/// </summary>
/// <param name="o"></param>
private void Execute(object o)
{
IActor actor = (IActor)o;
//
actor.Execute();
// 如果退出,则设置退出标志位
if (actor.Exited)
{
Thread.VolatileWrite(ref actor.Context.Status, ActorContext.Exited);
}
// 否则进行下一个消息处理
else
{
Thread.VolatileWrite(ref actor.Context.Status, ActorContext.Waiting);
if (actor.MessageCount > )
{
this.ReadyToExecute(actor);
}
}
}
}
修改的位置:
/// <summary>
/// 处理消息
/// </summary>
void IActor.Execute()
{
T message;
var dequeueSucess = this._messageQueue.TryDequeue(out message); if (dequeueSucess)
{
this.Receive(message);
}
}
老赵原来的方式:
public void Post(T message)
{
if (this.m_exited) return; lock (this.m_messageQueue)
{
this.m_messageQueue.Enqueue(message);
} Dispatcher.Instance.ReadyToExecute(this);
}
根据老赵轻量级Actor进行修改的Actor模型的更多相关文章
- 老赵点滴地址:http://blog.zhaojie.me/2009/05/a-simple-actor-model-implementation.html
老赵点滴地址:http://blog.zhaojie.me/2009/05/a-simple-actor-model-implementation.html
- 将不确定变为确定~老赵写的CodeTimer是代码性能测试的利器
首先,非常感谢赵老大的CodeTimer,它让我们更好的了解到代码执行的性能,从而可以让我们从性能的角度来考虑问题,有些东西可能我们认为是这样的,但经理测试并非如何,这正应了我之前的那名话:“机器最能 ...
- 修改Chem 3D模型的化学键属性的方法有哪些
很多的用户在绘制化学图形过程中发现很多的图形都是立体结构的,这个时候就需要用Chem3D,它是ChemOffice的核心组件之一,在绘制立体模型和计算化学数据方面具有不可替代的作用.虽然ChemDra ...
- AF(操作者框架)系列(2)-在Actor框架中派生Actor核心(命令模式)
为了能够提高程序的复用性,我们准备用Actor Framework框架,来演示其满足了这个需求(本章及后面的内容,需要有OOP的基础知识). 首先,简述一下ActorFramework的运行过程: 在 ...
- (转).net面试题(老赵)
转自:http://www.cnblogs.com/chenxiaoran/archive/2012/05/27/2519988.html 1.什么是CLR 公共语言运行时(Comman langua ...
- actor、reactor与proactor模型:高性能服务器的几种模型概念(转)
actor模型: 实体之通过消息通讯,各自处理自己的数据,能够实现这并行. 说白了,有点像rpc. skynet是actor模型. reactor模型: 1 向事件分发器注册事件回调 2 事件发生 4 ...
- pytorch中修改后的模型如何加载预训练模型
问题描述 简单来说,比如你要加载一个vgg16模型,但是你自己需要的网络结构并不是原本的vgg16网络,可能你删掉某些层,可能你改掉某些层,这时你去加载预训练模型,就会报错,错误原因就是你的模型和原本 ...
- 专业上的常用的工具和类库集 By 老衣
Visual Studio 2013 扩展 CodeMaid: 可快速整理代码文件,清理不必要的代码和杂乱的格式.并在开发时实时提供代码复杂度的报告,以便帮助开发人员降低代码复杂度.提高代码质量. C ...
- 进程、线程、轻量级进程、协程与 go 的 goroutine【转载+整理】
本文内容 进程 线程 协程 Go 中的 goroutine 参考资料 最近,看一些文章,提到"协程"的概念,心想,进程,线程,协程,前两个很容易,任何一本关于操作系统的书都有说,开 ...
随机推荐
- VS2010中更改项目名称(转载)
一.修改解决方案的名称:直接选择解决方案,右键重命名即可.
- IOS(swift)-数据存储 · 用NSUserDefaults存储配置信息
1.用NSUserDefaults存储配置信息 注:本次使用NSUserDefaults存储信息是在不考虑安全问题的前提下.分两种情况:1.如果是密码用户名等敏感信息,请使用Keychain存储用户敏 ...
- 【转载】【转自AekdyCoin的组合数取模】
本篇文章主要介绍了"[组合数求模] 转自AekdyCoin",主要涉及到[组合数求模] 转自AekdyCoin方面的内容,对于[组合数求模] 转自AekdyCoin感兴趣的同学可以 ...
- 【拓扑排序】【HDU3231】【Box Relations】
题目大意: N个盒子 给你K个以下关系 1.A和B有重叠 2.A在B的左边且不重叠 3.A在B的前边且不重叠 4.A在B的上面且不重叠 显然单独分配X坐标处理2(x1<x2<x1'< ...
- C#获取变量名的扩展方法
// </summary> /// <param name="var_name"></param> /// <param name=&qu ...
- Mschart应用之曲线图表spline
本文主要是Mschart应用之曲线图表spline,实现6个模拟数据的图表,其中数据源X轴为当前系统时间,Y轴是由随机函数产生的不同范围的随机数. 首先是自定义一个数据表,然后产生的数据添加到该数据表 ...
- Linux自制离线源,利用百度网盘等下载离线资源
CentOS安装Axel: 目前yum源上没有Axel,我们可以到http://pkgs.repoforge.org/axel/下载rpm包安装. 32位CentOS执行下面命令: wget -c h ...
- ios9配置info.plist中关于安全访问问题
打开info.plist文件 - >添加App Transport Security Settings 字典类型,在App Transport Security Settings下增加Allow ...
- eclipse中使用Lombok
1.下载Lombok.jar http://projectlombok.googlecode.com/files/lombok.jar 2.运行Lombok.jar: java -jar D:\00 ...
- 菜鸟的jQuery源码学习笔记(三)
each: function(callback, args) { return jQuery.each(this, callback, args); }, each:这个调用了jQuery.each方 ...