并行任务优先级排序
- 更新时间2025-08-27
- 阅读时长5分钟
使用等待(ms)函数或修改VI属性对话框类别中执行页的优先级设置可对并行任务进行优先级排序。
多数情况下,无需修改VI的优先级,请保持其默认值。使用优先级去控制执行顺序可能会产生非预期结果。如果使用错误,低优先级的任务可能会被完全搁置。如果设计中高优先级的任务长时间运行,除非它定期等待,否则低优先级的任务将不会运行。
使用等待函数
使用等待函数可让不太重要的任务以较低的频率运行。例如,如果需要一些并行的循环更频繁地运行,可以对低优先级的任务使用等待函数,这样可为其他任务腾出更多的时间。多数情况下,只需使用等待函数,通常不需要通过在文件»VI属性的VI属性对话框中选择执行来修改其优先级。
如同步/封锁节点部分所述,当程序框图等待时,计算机将其从队列中移出以便其他任务运行。
等待函数在用户界面的轮询循环中非常有用。100到200毫秒的等待虽然很难察觉到,但却能让应用程序更有效地处理其他任务。此外,等待释放了操作系统,使之有更充裕的时间投入其他线程和应用程序。可考虑对程序框图中稍微次要的部分设置等待,以便为其他任务腾出更多时间。
等待(ms)函数使LabVIEW等待指定长度的时间。等待下一个整数倍毫秒函数,LabVIEW会在毫秒计时器到达指定整数个毫秒之前处于等待状态。
修改优先级
在文件»VI属性的VI属性对话框中选择执行可修改优先级。有以下优先级供选择,按其级别由低到高排序如下:
- 后台优先级(最低)
- 标准优先级
- 次高优先级
- 高优先级
- 实时优先级(最高)
- 子程序优先级
前五级优先级行为相似(从最低到最高),子程序级则具有其他特性。以下部分适用于前五级优先级(子程序级除外)。
用户界面执行系统的优先级
在多线程应用的用户界面执行系统中,执行系统队列有多个进入点。在队列中,执行系统把高优先级的VI放在低优先级VI的前面,如果高优先级的任务正在运行而队列中只包含低优先级任务,则高优先级的VI连续运行。例如,如果执行队列中两个不同优先级下分别有两个VI,最高优先级的两个VI将共享执行时间,直到执行完毕,然后高优先级VI共享执行时间,直到执行完毕,依次类推。但是如果较高优先级的VI调用等待函数,执行系统从队列中移出此优先级的VI直到这次等待或I/O完成,并分配其他(可能是低优先级的)任务运行。当这次等待或者I/O完成以后,执行系统将被挂起的任务重新插入队列中,放在较低优先级任务的前面。
如高优先级VI调用了一个低优先级的子VI,子VI将继承任何调用方VI的最高优先级,与调用方VI是否运行无关。因此,无需修改子VI的优先级,调用该子VI的VI会提升子VI的优先级。
其他执行系统和多线程应用程序中的优先级
每个执行系统对在每个优先级上都有一个独立的执行系统,不包括子程序优先级和用户界面优先级。每一个具有优先级的执行系统都有自己的队列和两个线程用于处理队列中的程序。
但并不是分为6个执行系统,而是1个用于用户界面系统(无论其优先级状态),另外25个用于其他系统(5个执行系统乘以5个优先级)。
根据分类,操作系统为每一个执行系统的线程分配不同的优先级别。因此,在典型的执行中,较高优先级的任务比较低优先级的任务得到更多的执行时间。与用户界面执行系统中的其他优先级相同,低优先级任务只有在高优先级任务暂时等待时才会运行。
一些操作系统通过定期提升较低优先级任务的优先级别来避免这个问题。在这些操作系统中,即使高优先级的任务想要连续运行,较低优先级的任务也能定时得到运行机会。但是对于不同的操作系统行为各异。对有些操作系统,可以调整任务的行为和优先级。
用户界面执行系统为单线程。在其他执行系统中,用户界面线程适用一般优先级。所以如果有一个高于一般优先级别的VI在标准执行系统中运行,用户界面执行系统可能不被执行,这可能导致用户界面变慢或者没有响应。同样,如果分配一个VI为最低优先级,它将比用户界面执行系统优先级低,
如前所述,如果一个VI调用了低优先级的子VI,在调用期间,子VI的优先级会被提升到和调用它的VI相同的优先级别上来。
子程序优先级
子程序级允许VI以最有效的方式运行。设置成子程序级别的VI不与其他VI共享执行时间。
当VI处于子程序级时,它有效地控制正在执行的线程,并与其调用者运行在同样的线程上。在子程序VI完成运行之前,其他VI不能在这个线程上运行,即使这些VI也是子程序级的。在单线程应用程序中,其他VI均不运行。在执行系统中,执行子程序的线程不对其他VI进行处理,但是执行系统中的第二个线程能和其他执行系统一起连续运行VI。
除了不与其他VI共享执行时间外,子程序VI的执行是流线型的,因此当子程序被调用时,前面板的输入控件和显示控件不会更新。子程序VI在前面板上不显示它执行的任何信息。
子程序可以调用其他的子程序VI,但是不能调用其他优先级的VI。如需最大限度地减少用于简单运算的子VI的系统开销,可以使用子程序级优先级。
而且,因为子程序设计为不与执行队列交互,因此它不能调用函数让LabVIEW将其拉出队列。这意味着它们不能调用等待、GPIB、VISA或者对话框函数。
子程序还有另外一个有助于最高优先级应用程序的功能,右键单击一个子VI并且从快捷菜单中选择遇忙时忽略子程序调用,如果子程序正在另外一个线程运行时,执行系统会跳过调用。这一功能可帮助执行系统在时间紧迫的循环中安全跳过子程序的执行操作,避免了等待完成子VI而导致的延时。如果跳过了子VI的执行,所有子VI在前面板上的显示控件的输出将还原为默认值。