diff userProgramsASRforDummies/worker.m @ 38:c2204b18f4a2 tip

End nov big change
author Ray Meddis <rmeddis@essex.ac.uk>
date Mon, 28 Nov 2011 13:34:28 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/userProgramsASRforDummies/worker.m	Mon Nov 28 13:34:28 2011 +0000
@@ -0,0 +1,88 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%   This program is free software; you can redistribute it and/or modify
+%   it under the terms of the GNU General Public License as published by
+%   the Free Software Foundation; either version 2 of the License, or
+%   (at your option) any later version.
+%
+%   This program is distributed in the hope that it will be useful,
+%   but WITHOUT ANY WARRANTY; without even the implied warranty of
+%   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%   GNU General Public License for more details.
+%
+%   You can obtain a copy of the GNU General Public License from
+%   http://www.gnu.org/copyleft/gpl.html or by writing to
+%   Free Software Foundation, Inc.,675 Mass Ave, Cambridge, MA 02139, USA.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% This is a function the makes sure all of the jobs get completed in an
+% orderly fashion. It is responsible for keeping unruly nodes in line.
+% NC 2010/1011
+
+function worker(workFolder)
+
+%unit testing
+% close all; clear all; clc
+% workFolder = 'D:\exps\_bar';
+
+
+%main script
+isloaded = 0;
+while ~isloaded
+    if numel(dir(fullfile(workFolder,'jobLock.txt'))) %Check to see if lock already in place
+        pTime = randi(30);
+        disp(['Worker function locked out -> waiting for ' num2str(pTime) ' seconds until next retry']);
+        pause(pTime);
+    else
+        load(fullfile(workFolder,'jobObject.mat'))
+        isloaded = 1;
+    end
+end
+
+
+
+x=obj;
+clear obj;
+x.initMAP; %Need to alert it to the path
+
+personalWork = 0;
+while(any(x.todoStatus==0))        
+    x.lockJobList;
+    x = x.loadSelf; %Reload incase changed
+    rJobs = 8+randi(8);%Grab 1st 9-16 open jobs
+    todoNow = find(~x.todoStatus,rJobs,'first');     
+    x.todoStatus(todoNow) = 1; %Flag it (them) as pending
+    x.storeSelf; %store pending flag as quickly as possible to minimise race condition impact
+    x.unlockJobList;
+    disp(['Grabbed ' num2str(numel(todoNow)) ' sound files for current job.'])
+        
+    % ---  DO WORK  ---
+    for tt=1:numel(todoNow)
+        if ~numel(dir(fullfile(x.opFolder,strrep(x.wavList(todoNow(tt)).name, '.wav','.map'))));
+            x.genFeat(x.wavList(todoNow(tt)).name);
+        else
+            disp(['File ' x.wavList(todoNow(tt)).name ' already processed'])
+        end
+        
+    end
+    % --- END OF WORK ---
+    
+    
+    x.lockJobList;
+    x = x.loadSelf; %Reload incase changed while processing (probably has)
+    x.todoStatus(todoNow) = 2; %Flag as complete
+    x.storeSelf; %Update as done immediately    
+    x.unlockJobList;
+        
+    clc
+    personalWork = personalWork+1;
+    disp( ['This process has completed ' num2str(personalWork) ' lists'] )
+    x.checkStatus        
+end
+
+disp('-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-')
+disp( ' > COMPLETED CURRENT JOB' )
+disp( ['  In the folder ' workFolder '  .....'] )
+disp( ['  This process completed ' num2str(personalWork) ' lists'] )
+disp('-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-')
+
+