Labview Actor Framework (一)

warning: 这篇文章距离上次修改已过1449天,其中的内容可能已经有所变动。

<h2>正文</h2>
<div>如果你已经使用LabVIEW编程2年以上,你将不可避免的会接触到生产者消费者,不可以避免的会设计属于自己QMH系统,甚至为解决多线程中的数据通信大费周折。</div>
<div></div>
<div>在程序只有个位数线程的时候,你会欣喜于自己可以控制多个线程进行不同的行为,但是当程序继续扩大,你不得不面临如下的问题:</div>
<div>1. 子线程中的错误越来越难以调试</div>
<div>2. 子线程中出现的BUG越来越难以复现</div>
<div>3. 子线程中的耗时代码很难定位</div>
<div></div>
<div>对于多线程中的队列和通讯关系,我们不得不承认对于线程的管理是一个艰难和痛苦的过程。</div>
<div></div>
<div>对于并发程序的开发,计算机科学进行了很多的理论推导,其中Actor Model作为一种并发的理论基础,不断发展,成为了解决并发问题的有效途径。</div>
<h2>Actor Model的起源</h2>
<div>
<div>Actor Model起源于1973年Carl Hewitt的论文,该模型灵感据说来源于物理学的广义相对论和量子力学并受到了Lisp,Simula的编程语言和Smalltalk早起版本的影响。</div>
<div></div>
<div>理论产生后由高度并行计算机的前景驱动其发展(在并行计算机硬件层级,系统由数十个,数百个,甚至数千个独立微处理器组成,每个处理器都有自己的本地存储和通讯处理器,通过高性能的网络进行通讯)</div>
<div></div>
<div>之后,Irene Greif  专门研究该模型,并为Acto Model 开发了一套操作术语作为其博士后的研究成果。</div>
<div></div>
<div>两年后, 亨利·贝克和休伊特出版了一套针对Actor系统的公理定律。</div>
<div></div>
<div>这些研究成果直接推动了ActorFramework的全面发展,它不仅仅是并发计算的一种理论体系,也是多个实际并发系统应用的理论基础。既应用于硬件系统层级的并发设计,而且也推动了软件并行开发的发展。</div>
</div>
<div></div>
<div>如果你希望获得Actor Model的准确定义,可以查看WIKI获取相关资料</div>
<div>https://en.wikipedia.org/wiki/Actor_model</div>
<div>如果你希望理解Actor Model的更多解释,可以参考文档(本文为阅读该文档的翻译和理解):</div>
<div>http://rerun.me/2014/09/11/introducing-actors-akka-notes-part-1/</div>
<div>如果你希望学习LabVIEW ActorFramework,你可以参考文档:</div>
<div>http://forums.ni.com/t5/Actor-Framework-Documents/READ-THIS-FIRST-to-get-started-with-Actor-Framework/ta-p/3493762</div>
<h2></h2>
<h2>什么是Actor Model</h2>
<div>Actor Model的理解从一个情境假设,并开始推演。</div>
<div></div>
<div>我们不妨将Actors认为是一个个人,规定这些人员不能互相进行语言沟通,他们仅仅通过邮件方式进行交流。</div>
<h3>1. Message</h3>
<div>假定两个人,一个作为老师,一个作为学生。学生每天早上给老师发送一封邮件,而老师给其一个反馈</div>
<div></div>
<div>这里将有这样一些沟通的要点:</div>
<div>1. 学生通过邮件沟通,并且一旦发送邮件,会话即开始,无法停止</div>
<div>2. 老师收到邮件后即进行对应的动作</div>
<div>3. 老师收到邮件后必然会反馈一封邮件</div>
<div>4. 学生可以在任何时候接收返回的邮件</div>
<div>5. 学生将不再存在一直阻塞等待的问题</div>
<div></div>
<div>通过这个例子,我们理解了Actor Model在解决消息发送中的流程</div>
<div></div>
<div></div>
<div>
<h3> 2.并发</h3>
<div>现在,我们不妨假设存在3对老师和学生,每一个学生发送邮件给任何一个老师,将会发生什么事情呢?</div>
</div>
<div></div>
<div>实际上什么都不会发生,每一个人都将会有属于自己的邮箱,但是这里有一个要点需要注意:</div>
<div></div>
<div>默认情况下,邮件中的邮箱按照到达的顺序去读取。【事实上可以通过对消息定义优先级来确保高优先级的消息先接收】</div>
<div></div>
<div>在默认情况下,其内部是一系列并发的、相互关联的队列。没有一个人会阻塞等待邮件接收,这个系统将是一个无阻塞的沟通。</div>
<div>

 


<h3> 3. Failover-故障切换</h3>
<div>我们继续假定老师是教授不同的课程,分别是历史、地理和物理。</div>
</div>
<div></div>
<div>历史老师回复了一个历史课的内容;</div>
<div>地理老师回复了一个有趣的地理知识;</div>
<div>哲学老师回复了一条格言。</div>
<div></div>
<div>每一个学生发送消息给老师时,都将获得一个回馈。学生不关心是哪个老师发送了回馈信息。</div>
<div>假如有一天,一个老师生病休息无法发送反馈信息,将会有一个新的代课老师来代替回复信息。</div>
<div></div>
<div>


<div> 这里有几个关键点需要注意:</div>
</div>
<div>1. 这个系统中,不同的Actor完成不同的操作</div>
<div>2. 如果Actor无法完成某一个操作,可以重新创建一个Actor来继续任务,或者忽略该任务</div>
<h3>4. 多任务处理</h3>
<div>不同的老师除了反馈自己的一些知识,也可在询问考试成绩的时候给出分数邮件。在Actor Model系统中,这意味着Actor 可以执行多种不同的Message</div>
<h3>5.改变</h3>
<div></div>
<div></div>
<div></div>
<div>在这个文档中,学生和老师将会变成我们的Actor,The Email Box 成为了Mail Box组件,请求和响应是一些静态不可修改的类,系统将Message路由给不同的Actor。</div>
<div></div>
<div>
<h2>LabVIEW中的映射</h2>
<div>在LabVIEW中,我们将映射这部分的逻辑关系,了解Actor Model的原理。</div>
<div>(本程序设计以LabVIEW版本为2015为准)</div>
<h3>Actor创建</h3>
<div>在学习ActorFramework时,我们先知道其选板位置为</div>
<div></div>
<div></div>
<div>面向对象编程的主要对话框为项目,为此我们创建一个空白的项目</div>

<div>新建Actor,创建基础的Actor模板</div>
<div></div>
<div>完成Student 的创建</div>
<div></div>
<h3>Method创建</h3>
<div>Student有属于自己的行为,所以为这个Actor创建属于自己的Method</div>
<div>


<div> 为Student创建Requested Quote</div>
</div>
<div></div>
<div></div>
<div>完善其方法,使其弹出Dialog!</div>
<div></div>
<div></div>
<h3></h3>
</div>
<h2> Message创建</h2>
<div>创建Student中Request Quote和Teacher中Quote Response的Message</div>
 


<div>完成创建后的Message将会多出一个Request Quote MSG</div>
<div> </div>
<div>
<h2> 启动Actor</h2>
<div>新建空白的LuanchVI</div>
<div></div>
<div></div>
<div>使用LaunchVI启动和Send Normal Stop进行停止</div>

</div>
<div>
<h2>发送消息</h2>
<div>通过Send Request Quote 发送消息</div>
<div>


<div></div>
</div>
<h2> 运行程序</h2>
<div>运行程序,我们实现了对Request消息的发送和异步执行</div>

<div> 未完待遇,更多精彩请看后续文章....</div>
<div></div>
<h2>后记</h2>
<div>本文介绍了Actor Model的基本概念, 并映射到LabVIEW中,写出了一个简单消息的发送Demo,后续将会对实际执行过程进行更加深入的分析,欢迎继续关注~</div>
</div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div>轉載自https://www.cnblogs.com/EltonLiang/p/6838895.html</div>

最后修改于:2020年11月24日 19:26

添加新评论