2013-05-20 8 views
5

Un collega ha un file MATLAB startup.m che contiene codice interattivo (chiama il comando questdlg per chiedergli quale directory di progetto desidera lavorare).Rileva se MATLAB startup.m è in esecuzione su un worker

Questo funziona bene per lui quando si esegue direttamente MATLAB. Tuttavia, ha anche bisogno di eseguire il codice MATLAB in parallelo, dopo aver avviato uno matlabpool.

All'avvio, i lavoratori del matlabpool sono in esecuzione il proprio fascicolo startup.m, di arrivare al questdlg e poi appeso (all'infinito, o fino a quando Ctrl C).

Una soluzione semplice è quella di solo sbarazzarsi del codice interattivo dal suo startup.m, in quanto non è davvero essenziale.

Ma c'è un modo per rilevare se questo startup.m viene eseguito da un lavoratore che si avvia - qualcosa di simile a isdeployed o ismcc? Quindi è in grado di mantenere il codice interattivo che trova utile, ma lo esegue solo quando non si avvia un lavoratore.

Il comando getCurrentWorker sembrava come se fosse ciò che era necessario, ma credo che funzioni solo durante l'esecuzione di un'attività, piuttosto che all'avvio.

risposta

2

è possibile utilizzare la funzione usejava per vedere se il desktop interattivo è in esecuzione, che è probabilmente una buona approssimazione sufficiente a meno che non si utilizza di frequente modalità -nodesktop.

if usejava('desktop') 
    questdlg(...); 
end 
+0

Grazie a @Edric. Personalmente, sarei a posto con qualcosa di non documentato se fosse il modo "giusto" di farlo - ma anche qui qualcosa di documentato che funziona fondamentalmente va bene. Sembra che usejava funzioni - grazie! –

0

Dai un'occhiata a labindex e, in caso contrario, labSend e labReceive.

+0

Purtroppo questo vi dirà nulla di quelli sono istituiti (o non) molto più tardi 'startup.m' – Edric

+0

@JoshuaBarr Ci dispiace, avrei dovuto dire che avevo anche provato' labindex', che non funziona per la ragione menzionata da @Edric. @Edric, hai qualche suggerimento? –

+0

@SamRoberts - sì, ci sono modi e mezzi che sono sicuro che tu ti rendi conto - è una questione di come non vuoi andare senza documenti. Pubblicherò una risposta che dovrebbe aiutare. – Edric

0

Almeno per il mio R2014b,

isempty(getCurrentWorker) 

sembrano fare il lavoro:

>> getCurrentWorker 
ans = 
    [] 
>> parfor i=1:2;disp(getCurrentWorker);end 
Worker 
       Host: IMP.OIMRDS 
     ComputerType: WIN64 

      ProcessId: 15784 
Worker 
       Host: IMP.OIMRDS 
     ComputerType: WIN64 

      ProcessId: 17220 
Problemi correlati