LabVIEW的ActorFramework笔记

news/2024/11/20 10:46:25/文章来源:https://www.cnblogs.com/StephenYoung/p/18346344

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设计完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/779110.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据跨境传输的安全合规风险如何规避?获取免费解决方案白皮书!

在全球化的背景下,企业进行有 效的资源整合,学习海外市场的先进技术和管理经验,寻找新的增长点,实现业务的多元化和 可持续发展,不仅有利于开辟新市场,更有助于巩固和增强企业在全球中的地位。在这种前景 下,越来越多的企业寻求更深度的跨国业务及合作,因此,企业数据跨…

IC设计企业如何真正实现便捷又高效地云租户文件传输?

越来越多的IC设计企业选择开通云租户的方式进行半导体芯片的设计和验证工作,也即在HPC环境中进行芯片设计流程,对于IC设计企业而言,使用云租户有明显的好处和优势: 资源分配:云平台会根据租户的需求分配相应的资源,如独立的身份ID、虚拟私有云(VPC)等。每个租户都拥有自…

给我5分钟,保证教会你在vue3中动态加载远程组件

前言 在一些特殊的场景中(比如低代码、减少小程序包体积、类似于APP的热更新),我们需要从服务端动态加载.vue文件,然后将动态加载的远程vue组件渲染到我们的项目中。今天这篇文章我将带你学会,在vue3中如何去动态加载远程组件。 欧阳写了一本开源电子书vue3编译原理揭秘,…

结合实例看 maven 传递依赖与优先级,难顶也得上丫

开心一刻 想买摩托车了,但是钱不够,想找老爸借点 我:老爸,我想买一辆摩托车,上下班也方便 老爸:你表哥上个月骑摩托车摔走了,你不知道?还要买摩托车? 我:对不起,我不买了 老板:就是啊,骑你表哥那辆得了呗,买啥新的先抛问题 关于 maven 的依赖(dependency),我相…

EmpireCMS_V7.5 sql注入漏洞

没有什么好说的侵权声明 本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。 如果您是版权持有人,并且认为您的作品被侵犯,请通过以下方式与我们联系: […

增强用户体验:2个功能强大的.NET控制台应用帮助库

前言 对于.NET开发者而言,构建控制台应用程序时,如何提升用户交互的流畅性和满意度,是一个持续探索与优化的话题。今天大姚给大家分享2个功能强大的.NET控制台应用帮助库,希望可以帮助大家能够快速的构建漂亮、强交互性、丰富功能的控制台应用程序。 Terminal.Gui Terminal…

2024牛客暑期多校训练营7

你说的对但是今天是伟大的御阿礼之子第九代稗田阿求同志的三十华诞目录写在前面JIKDCH写在最后 写在前面 比赛地址:https://ac.nowcoder.com/acm/contest/81602#question 以下按个人难度向排序。 dztlb 大神回去补办身份证了,于是单刷,打的像史。 呃呃抽象场。 J 签到。 手玩…

读零信任网络:在不可信网络中构建安全系统11用户组的认证和授权

读零信任网络:在不可信网络中构建安全系统11用户组的认证和授权1. 用户组的认证和授权 1.1. 几乎在每个系统中都有一小部分操作需要被密切关注1.1.1. 每个应用对这部分操作的风险容忍度各有不同,且没有任何下限1.1.2. 一部分风险是由用户个人的可信度决定的1.1.2.1. 单个用户…

软件测试设计1探索性测试

1 探索性测试 本章将介绍探索性测试:手动试用新功能,快速获得有关其行为的反馈。我们将详细介绍探索性测试,考虑它的优缺点,以及何时应在项目中执行探索性测试。 我们将了解开始探索性测试所需的先决条件以及应采取的方法。这种测试可以是完整测试计划的一个缩影,它从客户…

Kubernetes高级部署组件 Argo Rollout

Argo介绍 https://argoproj.github.io/ Argo 是一个开源项目,旨在提供一套用于在 Kubernetes 上运行和管理容器化工作负载的工具。 Argo 项目最早在2017年由Applatix公司创立开源,在2018年被美国加利福尼的 Intuit 公司收购并持续维护,并得到了广泛的社区支持。 Argo 项目主要…

n00bzCTF 2024

n00bzCTF 2024n00bzCTF 2024 Crypto Vinegar 题目:Encrypted flag: nmivrxbiaatjvvbcjsf Key: secretkeyexp: 维吉尼亚密码 ​​ flag:n00bz{vigenerecipherisfun} RSA 题目:e = 3 n = 1351123252887151367278321777355120706250832196704807178418175833438514454543565797…

两个coca略有不同词频文件 比较

coca20000xlsxFuzhi.a应该也是这样弄的.txt COCA60000.txt确实有一些词顺序不同,不知道为什么。。。