关于面向对象的方法并行执行的问题

LabVIEW的从同一个类实例化的多个对象如何执行各自的方法呢?

这几天跟同事讨论到LabVIEW的面向对象编程中,如果我设计的一个类有一个方法比较耗时,那么当我实例化多个对象时,那么这个耗时的方法是怎么执行的呢?是各自并行执行还是,必须等某一个对象的方法调用完,接下来调用第二个对象的该方法呢?

接下来,我们直接来做个试验吧!

试验设计:

我们设计一个类------Person

该类包含的一个描述其状态的私有数据------State;

有对该数据的读写的接口;

有一个耗时的方法------WalkAWay

好了,类的程序设计完了,我们做一个Main.vi来进行测试:

我们看下执行的结果:

该Main程序共计耗时为2个对象的Walk方法执行时间之和:2000+1500=3500ms;

由此,我们可以看到,默认设计的类,其方法在各个对象间是串行执行的;

接下来,重点:

我们回去修改下我们设计的类的WalkAWay方法。

然后再执行Main测试vi,执行结果:

该Main程序共计执行时间为最长按个WalkAWay方法执行的时间:2000ms.我们可以看到,这次就是并行执行了WalkAWay方法了。

至此,我们可以得出结论:

默认设计的类的方法是串行执行的。那么,如果有耗时的程序,我们可以通过调整方法的共享副本可重入属性来实现不同对象间调用方法并行执行。这个能大大节约程序执行时间,尤其是我们在多slot并行测试的软件设计时尤为重要。

说明:上述如果将方法vi的设置为第三个------预分配副本的话,类的设计会直接报错,也就是说LabVIEW不让我们这么设置。

附件:vi的可重入属性的说明:

Non-reentrant execution

不可重入: 多个调用者调用此VI时,是按照顺序逐一调用的。优势是最小的内存消耗,同时也会使得所有调用该VI的共享一个状态,在调用中保留控件和未被初始化移位寄存器的值。

Shared clone reentrant execution

可重入:在实例间共享副本(减少内存使用),允许多个调用者同步并行执行该VI,这个类型的可重入,为了减少内存消耗,在调用中复用克隆副本。

当调用者B调用该VI时,如果克隆实例正在被调用者A使用中,那么LabVIEW 会分配一个新的克隆实例给调用者B。

当调用者B调用该VI时,如果克隆实例没有被使用,那么LabVIEW不会再开辟新的克隆实例。因此每个调用者维护自己的状态,保留控件和未赋值移位寄存器的值

Preallocated clone reentrant execution

可重入:为各个实例预分配副本,允许多个调用者同步并行执行该VI,这个类型的可重入,为每一个实例预分配独立克隆实例,并以开辟更多的克隆实例为代价。

那么VI何时使用可重入,并且到底选共享副本还是各个实例预分配副本?

场景和原则

  1. 当VI中有使用全局变量、或者功能全局变量时,不能设置成---->可重入:在实例间共享副本(减少内存使用)

  2. 如读取文件一类时,可以考虑设置可重入,使得调用者可以并行执行,提高效率。

  3. 当需要实现一些,共享克隆实例时,可以考虑使用--->可重入:在实例间共享副本(减少内存使用) 例如 递归操作。

  4. 如果VI克隆实例暂用资源很小,但是运行时间较长,可以考虑使用---->可重入:为各个实例预分配副本

  5. VI可重入设置,是为多线程调用准备的,如果在该VI被调用过程中,不会出现多线程调用该VI,那么没有必要设置可重入,保持默认即可。

    引用自:https://www.cnblogs.com/YourDirection/p/12833877.html

相关推荐
LabVIEW开发9 小时前
LabVIEW中For 循环 “迭代并行”(Iteration Parallelism)
labview·labview知识·labview功能·labview程序
LabVIEW开发1 天前
LabVIEW多通道测控
labview·labview知识·labview功能·labview程序
LabVIEW开发2 天前
LabVIEW数据库事务操作
数据库·labview·labview知识·labview功能·labview程序
FreakStudio3 天前
亲测可用!可本地部署的 MicroPython 开源仿真器
python·单片机·嵌入式·面向对象·并行计算·电子diy·电子计算机
FreakStudio5 天前
和做工厂系统的印尼老哥,复刻了一套属于 MicroPython 的包管理系统
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
书到用时方恨少!7 天前
Python 面向对象进阶:多态——同一个接口,千种面孔
开发语言·python·多态·面向对象
Irene19918 天前
Python 面向对象总结:对比 JavaScript 的面向对象
javascript·python·面向对象
FreakStudio8 天前
做了个Claude Code CLI 电子宠物:程序员的实体监工代码搭子
python·单片机·嵌入式·面向对象·并行计算·电子diy·电子计算机
不会编程的懒洋洋8 天前
C# Task async/await CancellationToken
笔记·c#·线程·面向对象·task·同步异步
FreakStudio10 天前
无硬件学LVGL—定时器篇:基于Web模拟器+MicroPython速通GUI开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机