从Python访问Matlab时避免轮询

2024-10-01 11:33:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从Python访问Matlab(在Windows上,通过COM接口远程访问)。我的目标是:Matlab正在做一些工作,永久性地改变某个变量的值。我需要知道值何时超过某个常数。现在,我在一个不确定的循环中轮询Matlab变量的值,超过这个值就会中断。然而,当我懒洋洋地坐在那里听的时候,我想让Matlab来做这件事,告诉我。有没有办法做到这一点,如何做到最好?我曾想过定义一个传递给Matlab的回调函数,在exceedge事件上,它会触发Python中非繁忙等待循环的中断,但我怀疑它是否能起作用。我在Matlab和Python方面都不是很有经验,所以我们非常感谢提示。在

还有很多其他的代码,但现在基本上是

connectToMatlab(*args)
while True:
    val = getValueFromMatlab()
    if val > constant or timeout: break

我的想法是

^{pr2}$

然后让Matlab对val > constant调用breakLoop()。但是,我不知道是否可以让Matlab通过回调来实现这一点,如果可以,我不知道如何实现这样一个breakLoop()-函数。在


Tags: 函数com目标远程定义windows常数事件
1条回答
网友
1楼 · 发布于 2024-10-01 11:33:47

您可以用另一种方法来实现这一点,并使用文件系统作为在MATLAB和Python之间传递消息的一种方式。在

在MATLAB代码中,每次更改变量时,检查它是否超过某个阈值。如果是,请在预定位置创建一个新文件。把这看作是触发事件。在

现在在python代码中,使用文件系统中listenchanges的一些可用方法,并通过指示某个变量来响应以中断循环。在


编辑

以下是建议解决方案的框架:

matlab脚本.m

%# directory that Python code is watching for modifications
dirPath = 'some_directory';

x = 0;
for i=1:1000
    %# some lengthy operation
    pause(0.5)
    x = x + 1;

    %# check if variable exceeds threshold
    if x > 10
        %# save the workspace to MAT-file inside the directory watched.
        %# this shall trigger the notification in Python
        save( fullfile(dirPath,'out.mat') )
        break
    end
end

Python_代码.py

^{pr2}$

^{}函数首先检查指定对象的状态。如果它是非signaled,则调用线程将进入一个有效的等待状态,并且在等待对象被发出信号(或超时时间间隔过去)之前,它只消耗很少的处理器时间。在

你可以看到,当线程引用处于非信号状态的对象时,会有一个即时的上下文切换,也就是说,它从处理器上取下并进入等待/休眠模式。稍后当对象发出信号时,线程被放回可运行队列,并准备好执行。在

在这种等待状态下,虽然上下文切换有一定的开销,但在等待状态下不会浪费CPU周期。在

将其与“poll and wait”方法进行比较,后者在某种循环中等待并检查感兴趣对象的状态。这被称为spin或busy wait,这可能会浪费CPU周期。在

现在多亏了pywin32模块,我们可以直接使用那些^{}函数。实现应该是MSDN中给定的standard example的直接端口。在

或者,您可以将PyQt库与其QFileSystemWatcher类一起使用,而不是直接使用win32api。在

相关问题 更多 >