Если я правильно понимаю ваш вопрос, лучшим подходом было бы создать новый образ докера (на основе того, который вы используете сейчас) с предварительно установленными модулями и использовать этот образ для рабочего пространства вместо рабочего по умолчанию. [110 ]
Если вы работаете в Windows, вы можете сделать это:
[s,w] = dos( 'tasklist' );
numMatlabs = length( regexp( w, '(^|\n)MATLAB.exe' ) )
на 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) программа в настоящее время выполняется на
Вот еще один подход: вы можете использовать «Сервер автоматизации» 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 () для проверки результатов, он блок. Итак, вы хотите отслеживать их прогресс через файлы на диске. Так что это не может быть большой победой.
Что касается определения того, сколько процессов 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.
Хотите написать какой-нибудь 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());
}