首页 > 其他分享 >LabVIEW的ActorFramework笔记

LabVIEW的ActorFramework笔记

时间:2024-08-07 08:54:48浏览次数:14  
标签:ActorFramework 模型 actor LabVIEW 线程 笔记 消息传递 Actor 消息

1 前置知识储备

自分布式计算出现以来,业界已经开始广泛研究基于消息传递编程模型的解决方案。关于消息传递,Wikipedia 描述其广泛定义主要包括:远程过程调用(Remote Procedure Calls, RPC) 和 消息传递接口(Message Passing Interface, MPI)。但是,如今我们所谈到的消息传递,通常是指 actor 模型(Actor Model)。作为一种通用的消息传递编程模型,其起源于 20 世纪 70 年代,如今被广泛用于构建大规模可伸缩分布式系统。

Actor 模型

一个 actor 定义为一个计算单元。所谓麻雀虽小,五脏俱全,每个 Actor 包含了存储、通信、计算等能力。在分布式系统中,通常包含了非常多的服务器集群,每一台服务器又包含了大量 actor 实例,它们共同构成了强大的并行计算能力。

Actor 的核心思想是 独立维护隔离状态,并基于消息传递实现异步通信。围绕其进行实现,actor 通常包含以下特征:

每个 actor 持有一个邮箱(mailbox),本质上是一个队列,用于存储消息。
每个 actor 可以发送消息至任何 actor。
每个 actor 可以通过处理消息来更新内部状态,对于外部而言,actor 的状态是隔离的状态(isolated state)。

为了便于通信,actor 模型使用 异步 消息传递。消息传递不使用任何中间实体,如:通道(channel)。由于 actor 模型的消息是异步传递的,中间可能会经过很长时间,甚至丢失,因此无法保证消息到达目标 actor 时的顺序。每个 actor 都完全独立于任何其他实例,actor 之间的交互完全基于异步消息,因此能够在很大程度上避免共享内存的存在问题。

任务调度

Actor 模型根据任务调度的方式可以分为两种,分别是:

(1)基于线程(thread-based)的 actor 模型

基于线程的 actor 模型,其本质是为每一个 actor 分配一个独立的“线程”。这里的“线程”并不是严格意义的操作系统线程,而是广泛意义的执行过程,它可以是线程、协程或虚拟机线程。

在基于线程的 actor 模型中,每个 actor 独占一个线程,如果当前 actor 的邮箱为空,actor 会阻塞当前线程,等待接收新的消息。在实现中,一般使用 receive 原语。

这种 actor 模型实现起来比较简单,但是缺点也非常明显,由于线程数量受到系统的限制,因此 actor 的数量也会受到限制。现阶段,只有少部分 actor 模型采用基于线程的实现方式,如:Erlang、Scala Actor、Cloud Haskell。

(2)事件驱动(event-driven)的 actor 模型

在事件驱动的 actor 模型,actor 并不直接与线程耦合,只有在事件触发(即接收消息)时,才为 actor 的任务分配线程并执行。这种方式使用续体闭包(Continuation Closure)来封装 actor 及其状态。当事件处理完毕,即退出线程。通过这种方式,我们可以使用很少的线程来执行大量 actor 产生的任务。在实现中,一般使用 react 原语。

事件驱动的 actor 模型在消息触发时,会自动创建并分配线程。在这种过程中,一般的优化是将 actor 执行建立在底层的线程池之上,这些线程可以是线程、协程或虚拟机线程。从概念上讲,这种实现与 run loop、event loop 机制非常相似。

2 LabVIEW的AF示例

假设有学生和老师这两个actor,学生有个“向老师交了一份儿作业”的方法;老师有“给学生的作业打分。”这个方法;

先来设计学生这个actor:

(1)新建一个空白的Project,并命名保存为“AF_student_teacher.lvproj”:

(2)右键新建操作者Actor——Student:



student这个类我们还定义一个“姓名”的私有私有(私有字段);并写一个其“写入”的方法:

(3)新建 静态模板方法——交作业


“交作业”方法体代码:

(4)为“交作业”方法创建 消息:

(5)测试“Student”Actor:


点击vi运行按钮:

至此,第一个actor ——student设计完成。

标签:ActorFramework,模型,actor,LabVIEW,线程,笔记,消息传递,Actor,消息
From: https://www.cnblogs.com/StephenYoung/p/18346344

相关文章

  • 笔记——排列组合
    蓝月の笔记——排列组合篇摘要万恶的数学!Part1加乘原理小学奥数内容加法原理:当多个方案并列(即互不影响)时,总方案数为各个方案数之和例:共有\(k\)种交通工具可以从A地到B地,第\(i\)种交通工具有\(a_i\)班次,那么从A地到B地的总方案数为\(\sum_{1\lei\lek}a_i\)乘......
  • 【论文笔记】Cross-Domain WiFi Sensing with Channel State Information: A Survey
    Cross-DomainWiFiSensingwithChannelStateInformation:ASurveyIntroduction检测领域:检测领域里,大部分用的阈值检测或者简单的学习算法,例如SVM。fallsRT-Fall:Areal-timeandcontactlessfalldetectionsystemwithcommodityWiFidevicesWiFall:Device-fr......
  • jQuery基础学习笔记
    jQuery基础学习个人说明:本文所涉及的到各种jQuery中的函数,方法,api等都不完整,只是一些常用的方法而已,详情还得阅读官方文档中文版:https://www.jquery123.com/jQuery的简单介绍jQuery:是一个快速,小,功能丰富的]avaScript库。它使诸如HTML文档遍历和操作,事件处理、动画和Aja......
  • dp学习笔记
    数位dp对于数位上每个数的有约束的各类统计问题,可以考虑用数位dp解决。通常使用记忆化递归实现(更通用),属于比较板子的dp了。在进行记忆化递归时,通常需要考虑三个因素:前导零(有时需要考虑),值域边界限制(必定会有),题面要求限制。例题P2602[ZJOI2010]数字计数版子题,枚举\(0......
  • C++笔记,类和对象(上)
    对于类的初步认识目录对于类的初步认识(1)类的定义(2)类的访问限定符及封装(3)类的作用域(4)类的实例化(5)类的对象大小的计算(6)类成员函数的this指针(1)类的定义classclassName{//类体,由成员函数和成员变量组成};//一定要注意后面的分号类体中内容称为类的成员:类......
  • 【学习笔记】Matlab和python双语言的学习(最大最小化规划)
    文章目录前言一、最大最小化规划二、选址问题三、代码实现----Matlab1.Matlab的`fminimax`函数2.Matlab代码四、代码实现----python总结前言通过模型算法,熟练对Matlab和python的应用。学习视频链接:https://www.bilibili.com/video/BV1EK41187QF?p=28&vd_sour......
  • LLM学习笔记-位置编码篇
    在Transformer模型中,位置编码(PositionalEncoding)的引入是为了补充自注意力机制(Self-Attention)在捕捉序列位置信息方面的不足。自注意力机制是Transformer的核心,但它对输入序列的位置信息并不敏感。具体来说,Transformer模型对输入序列中的每个元素进行处理时是并行的,而不是像传统......
  • c语言11天笔记
    函数的概述函数:实现一定功能的,独立的代码模块。我们的函数一定是先定义,后使用。使用函数的优势:1.我们可以通过函数提供功能给别人使用。当然我们也可以使用别人提供的函数,减少代码量。2.借助函数可以减少重复性的代码。3.实现结构化(模块化)程序设计思想:结构化程序设......
  • 第6章>>实验6:PS(ARM)端Linux RT与PL端FPGA之间(通过Reg寄存器进行通信和交互)-《LabVIEW Z
    1、实验内容       前面第五章入门实验和上一个实验5里面我们向大家展示通过了布尔类型的Reg寄存器通道实现了ZYNQPS端ARM和PL端FPGA二者之间的开关量交互,抛砖引玉。       从本节实验开始,接下来4个实验我们将着重向大家讲解更为通用和更为全面的4种交互方......
  • 《数据资产管理核心技术与应用》读书笔记-第二章:元数据的采集与存储
    《数据资产管理核心技术与应用》是清华大学出版社出版的一本图书,全书共分10章,第1章主要让读者认识数据资产,了解数据资产相关的基础概念,以及数据资产的发展情况。第2~8章主要介绍大数据时代数据资产管理所涉及的核心技术,内容包括元数据的采集与存储、数据血缘、数据质量、数据监控与......