异步调用VI
- 更新时间2025-08-27
- 阅读时长5分钟
如通过子VI节点或通过引用调用节点以标准调用方法调用一个VI,数据流在被调用节点处暂停直到子VI返回结果。然后数据流从节点的输出端继续。
与上述方式不同,异步调用VI时,子VI运行的同时数据流仍然在调用方VI中继续。如调用方VI不是立即需要子VI的执行结果,就可考虑异步调用子VI。在这些情况下,异步调用可使子VI和调用VI并行运行,明显优化调用方VI的执行时间。关于异步VI调用的优点,请参考下列编程情境范例:
- 将任务分配给子VI,主VI继续运行
- 将一个任务的工作量分散到同一个VI的各个实例,尤其是直到运行时才知道任务需要的VI实例的个数
- 打开复杂的用户界面,界面由若干个单独的VI组成。这些VI必须并行运行,同时收集结果
异步VI调用概述
在LabVIEW中,异步VI调用包括下列步骤。
异步VI调用的类型
要进行异步VI调用,必须根据使用场合决定使用哪种类型的调用方法。关于每种每种的实现,请参考下列主题:
异步开始对一个VI的多个调用,实现并行执行LabVIEW如何管理异步VI调用:异步调用池
使用异步调用VI方法并不需要了解LabVIEW在后台如何管理这些异步VI调用。但是,了解异步调用池有助于用户设计确定性应用程序和优化程序的性能。如将异步选项标识作为“打开VI引用”函数选项输入端的一部分,将VI引用所指的VI异步运行,LabVIEW将创建一个数据空间的池,跟踪对VI的各个调用。因为LabVIEW将一个数据空间池,而不是一个数据空间,与VI引用关联,必须通过一个VI引用开始多个异步调用。每次使用“开始异步调用”节点通过VI引用开始异步调用时,LabVIEW都会在池中预留一个数据空间。VI结束运行后,LabVIEW将把输出放在数据空间中,并将VI调用标识为结束。如“等待异步调用”节点等待被调VI的输出,LabVIEW将从数据空间中返回结果,将数据空间释放给同一VI的其他调用。
异步调用池对性能的影响
对于各个VI引用,LabVIEW在终端计算机CPU核的异步调用池中创建一个数据空间。如同时开始的VI调用超过了可用的数据空间,LabVIEW将分配更多的数据空间,以增加调用池的大小。因为分配数据空间的过程所需的时间是不确定的,调用方VI在“开始异步调用”节点触发空间分配时,会有一个不可预期的时间延迟。
在开始异步调用节点处避免不可预期的延迟
如VI必须在实时操作系统上运行,必须避免不可预期的延迟的话,在调用Populate Asynchronous Call Pool方法开始任何同步之前,应对给定的VI引用预分配相应数量的数据空间。预分配数据空间使时间延迟在程序开始之前,而不是发生在“开始异步调用”节点的位置。
关于异步调用池影响VI执行速度的详细信息,请参考labview\examples\Application Control\VI Server\Asynchronous Call By Reference目录下的Populating the Asynchronous Call Pool VI。查找相关范例
异步调用池对从同一VI的多个调用中收集输出的影响
如要收集异步VI调用的结果,必须将被调用VI的引用传递至“等待异步调用”节点。因为“等待异步调用”节点接收VI的引用,而不是特定数据空间的引用,节点无法收集特定VI调用的输出。如对特定VI的调用结束,节点返回结束的调用的输出。详细信息请参考下列程序框图。
如标签所示,当多个“等待异步调用”节点使用同一个VI引用时,不能预测哪个节点将返回VI引用的某个调用的输出。在上面程序框图中,顶部的“等待异步调用”节点将返回开始异步调用2的输出,即使它被连线至开始异步调用1。如要对一个VI进行多个调用,还要保持“开始异步调用”节点与特定的“等待异步调用”节点相匹配,可使用下列方法:
- 为每个异步VI调用创建唯一的VI引用。如“等待异步调用”节点和“开始异步调用节点”共享一个VI引用,则两个节点就保证能指向同一个VI实例。该解决方案类似于从唯一的VI引用的调用中收集结果。
- 修改被调用VI,使其接收数字或字符串标识符作为输入,返回同样的标识符作为输出。异步调用VI时,将传递至“开始异步调用”节点的标识符与“等待异步调用”节点返回的标识符相比较。如二者一致,就可确定“等待异步调用”节点返回的是哪一个调用。