Обнаружьте процессы matlab из matlab

Если я правильно понимаю ваш вопрос, лучшим подходом было бы создать новый образ докера (на основе того, который вы используете сейчас) с предварительно установленными модулями и использовать этот образ для рабочего пространства вместо рабочего по умолчанию. [110 ]

8
задан AnnaR 13 May 2009 в 17:45
поделиться

5 ответов

Если вы работаете в Windows, вы можете сделать это:

[s,w] = dos( 'tasklist' );
numMatlabs = length( regexp( w, '(^|\n)MATLAB.exe' ) )
11
ответ дан 5 December 2019 в 07:36
поделиться

на linux

!ps -ef |grep "/usr/local/matlab78/bin/glnxa64/MATLAB"|wc -l

поможет (замените путь своим собственным и вычтите 1 для процесса grep)

(или для встраивания в функцию используйте также

[tmp, result] = system('ps -ef |grep "/usr/local/matlab78/bin/glnxa64/MATLAB"|wc -l');
str2double(result) - 1

, вы можете использовать

>>computer
ans = GLNXA64

, чтобы узнать, на какой системной архитектуре (win / linux / etc) программа в настоящее время выполняется на

3
ответ дан 5 December 2019 в 07:36
поделиться

Вот еще один подход: вы можете использовать «Сервер автоматизации» COM Matlab для запуска рабочих и управления ими из центрального процесса 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

Затем вы можете использовать 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

Затем

w = start_workers(3);
w{1}.Execute('evalasync(''my_workload(1)'')');
w{2}.Execute('evalasync(''my_workload(2)'')');

К сожалению, вы застряли в однопоточности в рабочих процессах, поэтому, если вы снова вызовете evalasync () для проверки результатов, он блок. Итак, вы хотите отслеживать их прогресс через файлы на диске. Так что это не может быть большой победой.

5
ответ дан 5 December 2019 в 07:36
поделиться

Что касается определения того, сколько процессов MATLAB в настоящее время выполняется на вашей машине, я бы, вероятно, пошел с ответом, который дал Эдрик . Затем вам нужно либо остановить некоторые из них, либо начать новые. Вот код (с использованием метода Edrics), который определит количество процессов MATLAB, откроет новые и немедленно запустит в них код. Я все еще изучаю часть, убивающую процесс ...

[s,w] = dos('tasklist');
nProcesses = numel(regexp(w,'(^|\n)MATLAB.exe'));
for n = 1:(3-nProcesses),  % Starts new processes if there are less than 3
  dos('MATLAB R2009a -nosplash -r why &');  % Starts a process and runs the
                                            %   built-in function "why.m"
end

Предполагая, что у вас запущен 1 процесс для запуска, этот код запустит еще 2 и затем вернет управление исходному процессу MATLAB (из-за символа "&" в вызов функции DOS ). Когда запускается каждый, он автоматически вызовет встроенную функцию MATLAB WHY (из-за "-r why" в вызове DOS), в результате чего в каждом новом окне будет появляться следующий текст:

Лысый и не слишком лысый и не чрезмерно умный хомяк повиновался напуганному, но не чрезмерно напуганному хомяку.

Заменив «почему» в вызове DOS на любой код / ​​m-файл, который вы хотите запустить, вы можете порождать новые процессы, которые мгновенно начинают вычислять числа.


] Использование Parallel Computing Toolbox:

(Это старая версия моего ответа, которую я оставляю здесь на случай, если кто-то сочтет ее полезной)

Если вы используете Parallel Computing Toolbox для создания пула рабочих MATLAB, вы бы хотели посмотреть на функцию MATLABPOOL . Вот несколько способов его использования:

>> poolSize = matlabpool('size')  % Check the current pool size

poolSize =

     0

>> matlabpool('open',2);  % Open a pool of 2 workers
Starting matlabpool using the 'local' configuration ... connected to 2 labs.
>> poolSize = matlabpool('size')  % Check the pool size again

poolSize =

     2

>> matlabpool('close');  % Close the pool of workers
Sending a stop signal to all the labs ... stopped.
2
ответ дан 5 December 2019 в 07:36
поделиться

Хотите написать какой-нибудь VBScript? Вы можете создать сценарий с помощью WMI , API администрирования Windows с привязками сценариев. WMI может перечислить все процессы на машине, включая имя образа, путь и командную строку. Найдите MATLAB.exes. Объект Win32_Process WMI также предоставляет большую часть информации, которую показывает Process Explorer , например время начала, использование ЦП и памяти.

Вы можете почти сценарий WMI из самого Matlab с помощью actxserver () и вызовы методов COM, но коллекции еще не работают. Но вы можете написать простой VBS, чтобы выполнять запрос списка процессов WMI и писать выходные данные, удобные для Matlab, а затем обрабатывать его. Это немного больше, чем использование списка задач, но вы можете найти дополнительную информацию полезной, если вы столкнетесь с кучей рабочих процессов. Например, командные строки, заголовки окон или время запуска процесса могут использоваться для различения рабочих при принятии решения о том, кого убить.

Чтобы убить их, вы можете использовать WMI Win32_Process.Terminate или выполнить командную оболочку для команды taskkill.

1246] Это все только для Windows. Если вы хотите сделать что-то переносимым, вы можете установить cygwin, а затем выполнить командную оболочку для команд ps и kill в стиле Unix в любой из ОС.

Боковое примечание: если вы заставляете обычные приложения Windows Matlab действовать как рабочие с " -r ", используйте команду try / catch на самом верхнем уровне вашего основного скрипта, чтобы убедиться, что он завершится, когда будет выполнено:

try
    do_your_work();
catch err
    warning('Got an error: %s', err.message); 
end

close force all  % prevent figures from making quit() balk
quit force

В противном случае ошибка, выданная в M-коде, может всплыть на верхний уровень и перетащить Matlab в основной цикл графического интерфейса пользователя ожидает ввода пользователя, и он будет выглядеть как зависший рабочий.

О, и если вы убиваете процессы Matlab из Matlab, вы, вероятно, хотите избежать самоубийства. Вот функция MEX, которая позволит вам определить свой собственный pid в Windows64 или Unix; при выборе жертв сверяйте его с pid-кодами целевых процессов. Более изящный ifdefs заставит его работать на win32.

/* mygetpid.c - MEX function to get PID */
#ifdef _WIN64
#include <process.h>
#define GETPID _getpid
#else
/* assume we're on Unix */
#include <unistd.h>
#define GETPID getpid
#endif
#include "mex.h"

void mexFunction(int nlhs,       mxArray *plhs[],
                 int nrhs, const mxArray *prhs[]
                )
{
    /* ... a real function would have nargin/nargout checks here... */
    plhs[0] = mxCreateDoubleScalar((int) GETPID());
}
0
ответ дан 5 December 2019 в 07:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: