[LabVIEW架构]ActorFramework(一)
前言
小黑结婚回来第二周了,每天忙于程序设计,时间比较紧张,所以文章一直没出来,也算憋大招了。
近期小黑将与大家一起认识一下ActorFramework,既是对自己一段时间写AF程序的总结,也是梳理,希望能勾起大家对AF的兴趣。
在第一个文档中,我们先来理解一下AF的概念,以及它的来龙去脉。
正文
如果你已经使用LabVIEW编程2年以上,你将不可避免的会接触到生产者消费者,不可以避免的会设计属于自己QMH系统,甚至为解决多线程中的数据通信大费周折。
在程序只有个位数线程的时候,你会欣喜于自己可以控制多个线程进行不同的行为,但是当程序继续扩大,你不得不面临如下的问题:
1. 子线程中的错误越来越难以调试
2. 子线程中出现的BUG越来越难以复现
3. 子线程中的耗时代码很难定位
对于多线程中的队列和通讯关系,我们不得不承认对于线程的管理是一个艰难和痛苦的过程。
对于并发程序的开发,计算机科学进行了很多的理论推导,其中Actor Model作为一种并发的理论基础,不断发展,成为了解决并发问题的有效途径。
Actor Model的起源
Actor Model起源于1973年Carl Hewitt的论文,该模型灵感据说来源于物理学的广义相对论和量子力学并受到了Lisp,Simula的编程语言和Smalltalk早起版本的影响。
理论产生后由高度并行计算机的前景驱动其发展(在并行计算机硬件层级,系统由数十个,数百个,甚至数千个独立微处理器组成,每个处理器都有自己的本地存储和通讯处理器,通过高性能的网络进行通讯)
之后,Irene Greif 专门研究该模型,并为Acto Model 开发了一套操作术语作为其博士后的研究成果。
两年后, 亨利·贝克和休伊特出版了一套针对Actor系统的公理定律。
这些研究成果直接推动了ActorFramework的全面发展,它不仅仅是并发计算的一种理论体系,也是多个实际并发系统应用的理论基础。既应用于硬件系统层级的并发设计,而且也推动了软件并行开发的发展。
如果你希望获得Actor Model的准确定义,可以查看WIKI获取相关资料
如果你希望理解Actor Model的更多解释,可以参考文档(本文为阅读该文档的翻译和理解):
如果你希望学习LabVIEW ActorFramework,你可以参考文档:
什么是Actor Model
Actor Model的理解从一个情境假设,并开始推演。
我们不妨将Actors认为是一个个人,规定这些人员不能互相进行语言沟通,他们仅仅通过邮件方式进行交流。
1. Message
假定两个人,一个作为老师,一个作为学生。学生每天早上给老师发送一封邮件,而老师给其一个反馈
这里将有这样一些沟通的要点:
1. 学生通过邮件沟通,并且一旦发送邮件,会话即开始,无法停止
2. 老师收到邮件后即进行对应的动作
3. 老师收到邮件后必然会反馈一封邮件
4. 学生可以在任何时候接收返回的邮件
5. 学生将不再存在一直阻塞等待的问题
通过这个例子,我们理解了Actor Model在解决消息发送中的流程
2.并发
现在,我们不妨假设存在3对老师和学生,每一个学生发送邮件给任何一个老师,将会发生什么事情呢?
实际上什么都不会发生,每一个人都将会有属于自己的邮箱,但是这里有一个要点需要注意:
默认情况下,邮件中的邮箱按照到达的顺序去读取。【事实上可以通过对消息定义优先级来确保高优先级的消息先接收】
在默认情况下,其内部是一系列并发的、相互关联的队列。没有一个人会阻塞等待邮件接收,这个系统将是一个无阻塞的沟通。
历史老师回复了一个历史课的内容;
地理老师回复了一个有趣的地理知识;
哲学老师回复了一条格言。
每一个学生发送消息给老师时,都将获得一个回馈。学生不关心是哪个老师发送了回馈信息。
假如有一天,一个老师生病休息无法发送反馈信息,将会有一个新的代课老师来代替回复信息。
1. 这个系统中,不同的Actor完成不同的操作
2. 如果Actor无法完成某一个操作,可以重新创建一个Actor来继续任务,或者忽略该任务
4. 多任务处理
不同的老师除了反馈自己的一些知识,也可在询问考试成绩的时候给出分数邮件。在Actor Model系统中,这意味着Actor 可以执行多种不同的Message
5.改变
在这个文档中,学生和老师将会变成我们的Actor,The Email Box 成为了Mail Box组件,请求和响应是一些静态不可修改的类,系统将Message路由给不同的Actor。
LabVIEW中的映射
在LabVIEW中,我们将映射这部分的逻辑关系,了解Actor Model的原理。
(本程序设计以LabVIEW版本为2015为准)
Actor创建
在学习ActorFramework时,我们先知道其选板位置为
面向对象编程的主要对话框为项目,为此我们创建一个空白的项目
新建Actor,创建基础的Actor模板

完成Student 的创建

Method创建
Student有属于自己的行为,所以为这个Actor创建属于自己的Method

完善其方法,使其弹出Dialog!
Message创建
创建Student中Request Quote和Teacher中Quote Response的Message

完成创建后的Message将会多出一个Request Quote MSG

发送消息
通过Send Request Quote 发送消息
运行程序
运行程序,我们实现了对Request消息的发送和异步执行

未完待遇,更多精彩请看后续文章....
后记
本文介绍了Actor Model的基本概念, 并映射到LabVIEW中,写出了一个简单消息的发送Demo,后续将会对实际执行过程进行更加深入的分析,欢迎继续关注~