从matlab中检测matlab进程

Ann*_*naR 8 matlab process

有没有办法从matlab程序中检测计算机上运行了多少个matlab进程?

我想要运行n个matlab进程.如果我太少,我想创造它们,如果我需要很多,我想杀死一些.你当然可以手动执行此操作,但如果可能的话,我更愿意自动执行此操作,而不是实现复杂.

附加信息:目前我正在使用windowsx64(vista),但我也对其他平台感兴趣.

Edr*_*ric 11

如果你在Windows上,你可以这样做:

[s,w] = dos( 'tasklist' );
numMatlabs = length( regexp( w, '(^|\n)MATLAB.exe' ) )
Run Code Online (Sandbox Code Playgroud)


And*_*nke 5

这是另一种方法:您可以使用Matlab的COM"自动化服务器"来启动工作人员并从中央Matlab流程控制它们.

function out = start_workers(n)
myDir = pwd;
for i=1:n
    out{i} = actxserver( 'matlab.application.single' );
    out{i}.Execute(sprintf('cd(''%s'')', myDir));
end
Run Code Online (Sandbox Code Playgroud)

然后你可以使用Execute()让它们运行.您可以使用计时器技巧来获得异步执行.

function out = evalasync(str)
%EVALASYNC Asynchronous version of eval (kind of)
%
% evalasync(str)  % evals code in str
% evalasync()     % gets results of previous call

persistent results status exception

if nargin == 0
    out = {status results exception}; % GetWorkspaceData doesn't like structs
    assignin('base', 'EVALASYNC_RESULTS', out); % HACK for Automation
    return
end

status = 'waiting';
    function wrapper(varargin)
        status = 'running';
        try
            results = eval(str);
            status = 'ok';
        catch err
            status = 'error';
            exception = err;
        end
    end

t = timer('Tag','evalasync', 'TimerFcn',@wrapper);
startat(t, now + (.2 / (60*60*24)));

end
Run Code Online (Sandbox Code Playgroud)

然后

w = start_workers(3);
w{1}.Execute('evalasync(''my_workload(1)'')');
w{2}.Execute('evalasync(''my_workload(2)'')');
Run Code Online (Sandbox Code Playgroud)

不幸的是,你在工作中遇到了单线程,所以如果你再次调用evalasync()来检查结果,它就会阻塞.因此,您希望通过磁盘上的文件监控其进度.所以这可能不是一场胜利.