前言
小黑结婚回来第二周了,每天忙于程序设计,时间比较紧张,所以文章一直没出来,也算憋大招了。
近期小黑将与大家一起认识一下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模板
![841277-20170511001041066-1177460558.png](https://i-blog.csdnimg.cn/blog_migrate/da13495c09588def5fe40a88d8031631.png)
完成Student 的创建
![841277-20170511001042972-1938333571.png](https://i-blog.csdnimg.cn/blog_migrate/f69d2a78dd018beeb04f406c12574205.png)
Method创建
Student有属于自己的行为,所以为这个Actor创建属于自己的Method
![841277-20170511001044488-1084837089.png](https://i-blog.csdnimg.cn/blog_migrate/faf406ac37a69836c747dde960e28209.png)
完善其方法,使其弹出Dialog!
Message创建
创建Student中Request Quote和Teacher中Quote Response的Message
![841277-20170511001045644-1253100215.png](https://i-blog.csdnimg.cn/blog_migrate/65c8368e2707ff2d3e7da0619d8a9e5d.png)
完成创建后的Message将会多出一个Request Quote MSG
![841277-20170511001046066-222049252.png](https://i-blog.csdnimg.cn/blog_migrate/e7c22825e5f16a9dc9582069d87a687e.png)
发送消息
通过Send Request Quote 发送消息
运行程序
运行程序,我们实现了对Request消息的发送和异步执行
![841277-20170511001049051-90516388.png](https://i-blog.csdnimg.cn/blog_migrate/c476acf129d731d759cb02281ed6231d.png)
未完待遇,更多精彩请看后续文章....
后记
本文介绍了Actor Model的基本概念, 并映射到LabVIEW中,写出了一个简单消息的发送Demo,后续将会对实际执行过程进行更加深入的分析,欢迎继续关注~