根据老赵轻量级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 参考资料 最近,看一些文章,提到"协程"的概念,心想,进程,线程,协程,前两个很容易,任何一本关于操作系统的书都有说,开 ...
随机推荐
- IOS中的几中观察监听模式
本文介绍Objective C中实现观察者模式(也被称为广播者/监听者.发布/注册或者通知)的五种方法以及每种方法的价值所在. 该文章将包括: 1 手动广播者和监听者(Broadcaster and ...
- To restore the database on a new host-将数据库恢复至一个新的主机上
To restore the database on a new host:1. Ensure that the backups of the target database are accessib ...
- .net TxetBox控件设置ReadOnly=True后台取值问题
1.为TxetBox添加onfocus=this.blur()进行模拟 2.通过 Request.From["TextBox"].Trim()取值; 3.后台CS文件设置TextB ...
- [代码]Java后台推送消息到IOS前端
PayLoad payLoad = new PayLoad(); payLoad.addAlert("test"); //手机端的提示消息 payLoad.addBadge( ...
- HTML网页制作:[12]使用框架结构之frameset
首先,我希望在你的目录下,有4个网页,各自显示不同的内容. 如图所示: 1.html显示“火影忍者” 2.html显示“英雄联盟” 3.html显示“嵌入式开发.网页开发.安卓开发” 4.html显示 ...
- JSON 解析第三方框架
常见的 JSON 解析第三方框架 JSONKit(最快) SBJson TouchJSON 以上三个框架的性能依次降低! 介绍 JSONKit 第三方框架的目的 JSON 的解析并不是表面上那么简单 ...
- dede 设置为全动态浏览
将织梦所有栏目设置为“使用动态页”,可以再建立栏目时选择“使用动态页”:也可以执行下面的SQL语句.update dede_arctype set isdefault=-1 将网站所有文档都设置为“仅 ...
- 解决Qt中QTableWidget类方法setItem 时导致程序崩溃问题
在为一个音乐播放器增加功能时莫明奇妙的出现程序崩溃,定位到是由于QTableWidget 的setItem方法导致的,最终在此处找到了解决方式. 大致是说不能在setItem之前连接cellChang ...
- Ubuntu packages multi-architectures
Show current machine architecture dpkg --print-architecture It's built-in to the currently installed ...
- python函数与方法装饰器
之前用python简单写了一下斐波那契数列的递归实现(如下),发现运行速度很慢. def fib_direct(n): assert n > 0, 'invalid n' if n < 3 ...