如何在Matlab中停止正在运行的脚本[重复]
Posted
技术标签:
【中文标题】如何在Matlab中停止正在运行的脚本[重复]【英文标题】:how to stop a running script in Matlab [duplicate] 【发布时间】:2011-01-25 08:01:39 【问题描述】:我在 Matlab 中编写了一个长时间运行的脚本,例如
tic;
d = rand(5000);
[a,b,c] = svd(d);
toc;
它似乎永远在运行。因为我在编辑器窗口中按 F5。所以我无法在 Matlab 控制台中按 C-Break 停止。
我只想知道如何停止脚本。我目前正在使用任务管理器来杀死 Matlab,这真的很愚蠢。
谢谢。
【问题讨论】:
【参考方案1】:Matlab 帮助说明了这一点—— 对于长时间运行的 M 文件,或者调用内置程序或长时间运行的 MEX 文件,Ctrl+C 并不总是有效地停止执行。通常,这发生在 Microsoft Windows 平台而不是 UNIX[1] 平台上。如果您遇到此问题,您可以通过在您的 M 文件中(例如,在一个大循环中)包含 drawow、pause 或 getframe 函数来帮助 MATLAB 中断执行。请注意,如果您使用 -nodesktop 选项启动 MATLAB,Ctrl+C 的响应速度可能会降低。
所以我认为不存在任何选择。许多复杂的 matlab 函数都会发生这种情况。要么我们必须等待,要么不要使用它们!
【讨论】:
【参考方案2】:如果由于您的脚本太长/太复杂而导致 ctrl+c 没有立即响应,请按住它。
当 matlab 执行一些更深层次的脚本时,break 命令不会运行,它要么不会在缓冲区中记录 ctrl 序列,要么会在完成这些代码之前或之后清除缓冲区.无论哪种情况,当 matlab 返回执行更多脚本时,它会识别出您正在按住 ctrl+c 并终止。
对于运行时间较长的程序,我通常会尝试找到一个提供状态更新的好地方,并且我总是伴随着一些时间使用 tic 和 toc。根据我在做什么,我可能会使用运行时间、分段时间、某种平均值等...
对于真正长时间运行的程序,我发现这非常有用 http://www.mathworks.com/matlabcentral/fileexchange/16649-send-text-message-to-cell-phone/content/send_text_message.m
但看起来他们也有一些更新的功能。
【讨论】:
【参考方案3】:MATLAB 在执行 mex 实现的函数(如 svd)时不响应 Ctrl-C。此外,当 MATLAB 分配大块内存时,它没有响应。一个好的做法是始终为少量数据运行您的函数,并在所有测试通过时运行它以实现实际规模。当时间成为问题时,您可能需要分析每段代码运行的时间以及它们的粗略时间复杂度。
【讨论】:
【参考方案4】:考虑有多个 matlab 会话。保留主会话窗口(包含所有颜色、文件管理器、命令历史记录、工作区、编辑器等的漂亮窗口)以运行您知道将终止的东西。
您正在试验的东西,假设您正在使用 ode 套件并且您收到很多警告:矩阵单数,因为您更改了一些参数并且没有预测会发生什么,请在单独的会话中运行:
dos('matlab -automation -r &')
您可以杀死它而无需重新启动整个 Matlab。
【讨论】:
【参考方案5】:我采用的一个解决方案——用于 java 代码,但概念与 mexFunctions 相同,只是更混乱——是返回一个 FutureValue,然后在 FutureValue.finished() 或任何返回 true 时循环。实际代码在另一个线程/进程中执行。包装一个 try,catch 并在 catch 块中使用 FutureValue.cancel() 对我有用。
在 mex 函数的情况下,您将需要返回某种指针(作为 int),该指针指向具有您需要的所有数据的结构/对象(本机线程处理程序、用于完成的 bool 等)。在内置 mexFunction 的情况下,您的 mexFunction 很可能需要在单独的线程中调用该 mexFunction。 Mex 函数毕竟只是 DLL/共享对象。
伪代码
FV = mexLongProcessInAnotherThread();
try
while ~mexIsDone(FV);
java.lang.Thread.sleep(100); %pause has a memory leak
drawnow; %allow stdout/err from mex to display in command window
end
catch
mexCancel(FV);
end
【讨论】:
这似乎是我需要的东西。但是,这个函数叫做 mexCancel,那个看起来怎么样? @patrik 这完全取决于您的漫长过程是什么样的。本质上,cancel、isdone 和 longprocess 都需要用 c 编写才能协同工作,导出到 dll,然后编写 mex 函数来调用这些函数。既不容易也不干净,也不会有通用代码。 感谢您的回答。这似乎有点令人沮丧,但无论如何,如果能做到这一点,那肯定是一个漂亮的解决方案。【参考方案6】:既然您提到了任务管理器,我猜您使用的是 Windows。假设您在编辑器中运行脚本,如果您不反对在退出正在运行的程序的同时退出编辑器,则结束进程的键盘快捷键是:
Alt + F4
(我的意思是同时按键盘上的“Alt”和“F4”键。)
或者,如其他答案中所述,
Ctrl + C
应该也可以,但不会退出编辑器。
【讨论】:
【参考方案7】:如果您在 linux 上运行 matlab,您可以通过 linux consule 中的命令终止 matlab。 首先你应该通过这段代码找到matlab的PID号:
顶部
那么你可以使用这段代码来杀死matlab: 杀了
示例: 杀死58056
【讨论】:
【参考方案8】:补充:
您可以在具有密集或可能死锁的循环中插入时间检查,即。
:
section_toc_conditionalBreakOff;
:
在本节中的位置
if (toc > timeRequiredToBreakOff) % time conditional break off
return;
% other options may be:
% 1. display intermediate values with pause;
% 2. exit; % in some cases, extreme : kill/ quit matlab
end
【讨论】:
以上是关于如何在Matlab中停止正在运行的脚本[重复]的主要内容,如果未能解决你的问题,请参考以下文章
当另一个 python 脚本正在运行时,如何停止我的 python 脚本?